使用带有自己的 PrintStream 的 ConsoleHandler 抑制 System.err

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


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 构造函数中设置的输出流无关。


慕工程0101907
浏览 169回答 1
1回答

慕森王

堆栈跟踪(打印到 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();    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java