我希望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();
}
}