亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用帶有自己的 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使用不允許關閉流的代理來包裝現有流?;蛘咧皇菙U展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 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號