1

java.util.logging.LoggerアプリケーションへのログインにClassを使用しています。アプリケーションログがlog.txtファイルに直接保存されるようにFileHandlerを追加しました。

しかし、何らかの理由で、アプリケーションが終了した後、ログは完全にはほど遠いです。cmdでは、すべてのステートメントを表示できますが、ファイルに追加されることはありません。

次の方法でFileHandlerをロガーに設定しました。

private void setLogger() {
    try {
        FileHandler hand = new FileHandler("log/log.txt", true);
        hand.setFormatter(new SimpleFormatter());
        Logger log = Logger.getLogger(ImageRename.MAIN_LOG);
        //log.setUseParentHandlers(false);
        log.addHandler(hand);
        log.setLevel(Level.ALL);          
    } catch (IOException e) {
        System.out.println("Could Not set logger");
    }
}

フラッシングに問題はありますか?それを解決する方法は?ありがとう。

PS:デバッグ中に、その間に気づきました

Logger.getLogger(ImageRename.MAIN_LOG).getHandlers()。length

0を返します。1を返す必要があります。最初は1を出力していましたが、行のどこかでゼロになります。

4

2 に答える 2

3

問題は...ガベージコレクションです。

何が起こっているのかはおそらく次のとおりです。

  1. あなたが呼ぶLogger.getLogger(ImageRename.MAIN_LOG);
  2. ロガーをセットアップします。
  3. Javaはそれが参照されていないことに気づき、それを破棄します。
  4. あなたは電話Logger.getLogger(ImageRename.MAIN_LOG);をして、同じロガーを手に入れることを期待しています。
  5. 新しいロガーがデフォルト構成でセットアップされます。

これは、次の2つの方法で回避できます。

  • 構成には構成ファイルlogging.propertiesを使用します。ロガーを作成するとき、JavaロギングAPIは構成を参照し、適切に再作成します。
  • 静的参照を使用します。とにかく、これはベストプラクティスです。各クラスにロガーを装備します。

    private final static Logger LOG =
        Logger.getLogger(ExampleClass.class.getName());
    

クラスがロードされている間は、ガベージコレクションされたAFAICTであってはなりません。

于 2012-09-05T08:34:17.747 に答える
1

例については、たとえばhttp://www.massapi.com/class/fi/FileHandler.htmlを参照してください(Google経由で見つかりました)

次の行に注意してください。これが問題になる可能性があります。

fileHandler.setLevel(Level.ALL);

(注:これは、またはメッセージHandlerではなく、のレベルです。)Logger

ERRORデバッグの場合、最初にログに記録されたレベルでメッセージを取得してみてください。レベルINFO以下のメッセージは、デフォルトで抑制されることがよくあります。

また、できるだけ早くログレベルを設定してみてください。私の経験では、Javaロギングを構成する最も信頼できる方法は、プロパティファイルを使用し、次のコマンドでJavaを呼び出すことです。

-Djava.util.logging.config.file=path/to/file/logging.properties

その理由は、ロギングにいくつかの変更が加えられると、設定をロードする前に作成されたロガーに設定が適用されない場合があるためです。

于 2012-09-05T07:59:42.087 に答える