2015-12-08 62 views
6

我有一個簡單的設置登錄消息:JDK 8 Update 65Eclipse Mars爲什麼java.util.logging.Logger會打印到stderr?

import java.util.logging.Logger; 

public class Example { 

    private final static Logger LOGGER = Logger.getLogger(Example.class.getName()); 

    public static void main(String[] args) { 
     LOGGER.info("Test"); 
    } 

} 

我希望對stdout得到一個輸出,就像使用System.out.println();
但是相反沾到了stderr,導致紅色字體Eclipse控制檯上打印出來:

enter image description here

我知道我可以通過編寫自定義Handler改變這種行爲,但我想知道爲什麼默認輸出出現在stderr而不是stdout

記錄程序應該使用stdoutfine + info和使用stderrsevere水平。

回答

0

默認情況下,記錄器將INFO級別及更高級別(即INFO,WARNING和SEVERE)的日誌記錄輸出到標準錯誤流(System.err)。

來源:www3.ntu.edu.sg/home/ehchua/programming/java/JavaLogging.html

+0

您是否有此聲明的來源或證據? –

+0

對不起,我應該在評論中提供它:) https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaLogging.html –

+0

記錄器是否已經被OP知道,問題是:「爲什麼」。 – Tom

3

這是有據可查的。默認情況下,記錄器發佈到其父處理程序,遞歸到樹,直到指定了其他處理程序。您可以遍歷父進程的處理程序,並查看父進程記錄器的缺省處理程序是ConsoleHandler,它使用System.err發佈日誌記錄。

public class Main { 
    public static void main(String[] args) { 
     Handler[] handlers = Logger.getLogger(Main.class.getName()).getParent().getHandlers(); 
     for (Handler handler : handlers) { 
      System.out.println(handler.getClass().getName()); 
     } 
    } 
} 
2

java.util.logging APIJSR 47: Logging API Specification下開發的。根據「建議的最終草案」中的更改日誌,ConsoleHandler始終使用System.err。 JCP頁面還列出了API的原始作者,我認爲只有這些名稱才能真正知道你的問題的答案。

我會想象,起源來自記錄是報告失敗和失敗報告指向System.err的心態。對於ConsoleHandler來說,如果您在添加日誌API之前嘗試維護JDK的先例,那麼INFO之上的任何級別應該轉到錯誤流,並且任何級別INFO或更少級別都應該轉出流。

相關問題