为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕工程0101907 2021-06-21 17:09:47
我想在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 构造函数中设置的输出流无关。
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

堆栈跟踪(打印到 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();

    }

}


查看完整回答
反对 回复 2021-06-23
  • 1 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信