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

标签 java java.util.logging

我希望 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/

相关文章:

java - 可扩展 ListView : want to add child list lazy loading under every group

java - 在 Android 的 LogCat 中显示的 jar 文件中使用 java.util.logging.Logger

java - IntelliJ 上的 Lombok @SuperBuilder 解决方法

Javafx 生成形状数组列表

java - 如何从 Firebase 实时数据库检索用户用户名以获取欢迎回复消息?

Javalogging.properties文件仅打印特定的记录器

java - Android Eclipse 如何将渲染的 GLsurfaceView 保存为 *.png 图像

java - 使用多个参数记录

logging - SFL4J 和 JDK 日志记录之间的不同日志记录级别