将 ConsoleHandler 与自己的 PrintStream 结合使用会抑制 System.err
Using ConsoleHandler with own PrintStream suppresses System.err
我希望 Java ConsoleHandler
使用 System.out
而不是 err
,所以我实现了自己的处理程序来调用父级的 protected void setOutputStream(OutputStream)
StreamHandler
class:
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 构造函数中设置的输出流。
The stacktrace (printed to System.err) is not printed any more, without my changes it is printed as usual
这是因为 setOutputStream
closes the previously assigned System.err
stream. This is a known issue filed under JDK-4827381: Invoking ConsoleHandler.setOutputStream(...) closes System.err. What should have happened with that bug report is that the 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();
}
}
我希望 Java ConsoleHandler
使用 System.out
而不是 err
,所以我实现了自己的处理程序来调用父级的 protected void setOutputStream(OutputStream)
StreamHandler
class:
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 构造函数中设置的输出流。
The stacktrace (printed to System.err) is not printed any more, without my changes it is printed as usual
这是因为 setOutputStream
closes the previously assigned System.err
stream. This is a known issue filed under JDK-4827381: Invoking ConsoleHandler.setOutputStream(...) closes System.err. What should have happened with that bug report is that the 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();
}
}