2015-12-08 31 views
6

は、私がメッセージをログに記録する簡単なセットアップを持っている:JDK 8 Update 65Eclipse Marsjava.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"); 
    } 

} 

私はちょうどSystem.out.println();を使用してのように、stdout上の出力を得ることを期待します。
しかし、それはEclipseのコンソールに赤いフォントになりstderr、プリントアウトされます代わりに

enter image description here

私はカスタムHandlerを書き込むことによって、この動作を変更することができます知っているが、私stdoutの代わりにstderrにデフォルトの出力が表示される理由を知りたいですか?

ロガーはfine + infoためstdoutを使用しsevereレベルについてstderrを使用すべきです。

答えて

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

。デフォルトでは、ロガーは他のハンドラが指定されるまで、親のハンドラにツリーまで再帰的にパブリッシュします。親のハンドラをループして、親のロガーのデフォルトハンドラがSystem.errを使用してログレコードを発行するConsoleHandlerであることを確認できます。

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の場合、INFOより上のレベルはエラーストリームに移動し、INFO以下のレベルは、ロギングAPIを追加する前にJDKの先例を維持しようとしている場合は、ストリームに進む必要があります。

関連する問題