将ConsoleHandler与自己的PrintStream一起使用会抑制System.err



我希望JavaConsoleHandler使用System.out而不是err,所以我实现了自己的处理程序,该处理程序调用父StreamHandler类的protected void setOutputStream(OutputStream)

public class ConsoleHandler extends java.util.logging.ConsoleHandler {
public ConsoleHandler() {
setOutputStream(System.out); // or System.err
setLevel(Level.ALL);
}
}

我从中删除了默认的控制台记录器,并将自己的日志添加到根记录器:

Logger l = Logger.getLogger("");
for (Handler h : l.getHandlers())
l.removeHandler(h);
l.addHandler(new ConsoleHandler());
System.out.println("OUT");
System.err.println("ERR");

问题:始终打印"OUT",但从不打印"ERR",这与我在ConsoleHandler构造函数中设置的输出流无关。

堆栈跟踪(打印到System.err(不再打印,如果没有我的更改,它将像往常一样打印

这是因为setOutputStream关闭了先前分配的System.err流。这是在JDK-4827381下提交的一个已知问题:调用ConsoleHandler。setOutputStream(…(会关闭System.err。该错误报告应该发生的是StreamHandler.setOutputStream应该调用Handler.close而不是flushAndClose()

您需要使用不允许关闭流的代理来包装现有的System.err流。或者只需扩展StreamHandler并使用接受OutputStream的构造函数。

public class OutConsoleHandler extends StreamHandler {
public OutConsoleHandler() {
super(System.out, new SimpleFormatter());
//TODO: Read level,filter,encoding from LogManager.
}
@Override
public void publish(LogRecord record) {
super.publish(record);
super.flush();
}
@Override
public void close() {
super.flush();
}
}

相关内容

最新更新