我希望 Java ConsoleHandler
使用 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 构造函数中设置的输出流无关。
最佳答案
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 。这是在 JDK-4827381: Invoking ConsoleHandler.setOutputStream(...) closes 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();
}
}
关于java - 将 ConsoleHandler 与自己的 PrintStream 一起使用会抑制 System.err,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51641805/