4

java.util.Logging API について学習していますが、以下のサンプル コードに示すように、冗長な出力が生成される理由がわかりません。

Logger logger      = Logger.getLogger("");
Logger logger1     = Logger.getLogger("1");
Logger logger1_2   = Logger.getLogger("1.2");

logger1    .addHandler(new ConsoleHandler());
logger1_2  .addHandler(new ConsoleHandler());

logger     .info("msg:");
logger1    .info("msg: 1");
logger1_2  .info("msg: 1.2");

コンソールへの出力:

14-01-2012 10:32:41 java.util.logging.LogManager$RootLogger log
INFO: msg:
14-01-2012 10:32:42 logging.LoggingExamples main
INFO: msg: 1
14-01-2012 10:32:42 logging.LoggingExamples main
INFO: msg: 1
14-01-2012 10:32:42 logging.LoggingExamples main
INFO: msg: 1.2
14-01-2012 10:32:42 logging.LoggingExamples main
INFO: msg: 1.2
14-01-2012 10:32:42 logging.LoggingExamples main
INFO: msg: 1.2

ログ メッセージが親に渡され、同じメッセージが何度も表示されるのはなぜですか!? これはまったく効率的ではなく、重複した情報に対してログ ファイルが急速に増加します。理由を知っている人はいますか?これは Logging が持つべき性質ですか?

注: サンプル コードはhttp://tutorials.jenkov.com/java-logging/logger-hierarchy.htmlからコピーされました。

4

1 に答える 1

4

問題は、最上位のインスタンスにのみ追加する必要がある場合に、各 Log インスタンスにハンドラーを追加していることだと思います。

実際に java.util.Loggin をどのように使用したかを次に示します。メイン クラスでは、パッケージ名からグローバル ロガーを作成します。 globalLog = Logger.getLogger("thornworks");

次に、メイン クラスで、このグローバル ログにハンドラーを追加します (ログ メッセージは Netbeans によってキャプチャされ、最終的にはコンソール ウィンドウに表示されるため、後で調べることができるようにメッセージをファイルに書き込みたいと思いました)。

    Date now = new Date();
    java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("D_hh_mm");
    String logName = "[baseFilename]" + df.format(now);
    File logFolder = new File(someDirectory, "logs");
    try {
        if(!logFolder.exists())
            logFolder.mkdir();
        File logFile = new File(logFolder,logName+".log");
        Handler logFileHandler = new FileHandler(logFile.getAbsolutePath());
        logFileHandler.setFormatter(new SimpleFormatter());
        globalLog.addHandler(logFileHandler);            
    }
    catch(java.io.IOException ioe) { /* Log file could not be created. */  }
    globalLog.setLevel(Level.INFO);

次に、何らかのロギングを行う必要がある他のクラスが、このグローバル ロガーからロガーを作成します。

例えば、fileLogger = GUI.globalLog.getLogger(FileFunction.class.getName());

このロガーの名前は現在thornworks.FileFunction. これは親ロガーである globalLog の子であるため、fileLogger によって生成されたすべてのメッセージが globalLog に渡されます。fileLog によって生成されたメッセージは、fileLogger を取得した方法により、メッセージがどのクラスから来たかを示します。

これらすべてのログ メッセージを保存する方法と場所について気が変わった場合、メイン クラスのコードを数行変更するだけで、アプリケーション全体のすべてのログ メッセージがこの新しい場所に送信されます。位置。メイン ロガーのレベルを変更して生成されるメッセージを少なくすることもできますが、クラス レベルのロガーのレベルを上げて、コードのその部分に関する詳細情報を取得することもできます。

于 2012-11-15T13:27:33.903 に答える