1. ホーム
  2. java

[解決済み] Level.FINEのロギングメッセージが表示されないのはなぜですか?

2022-08-13 06:18:28

質問

その の JavaDocs java.util.logging.Level の状態になります。


レベルを降順に並べると

  • SEVERE (最高値)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST (最低値)

ソース

import java.util.logging.*;

class LoggingLevelsBlunder {

    public static void main(String[] args) {
        Logger logger = Logger.getAnonymousLogger();
        logger.setLevel(Level.FINER);
        System.out.println("Logging level is: " + logger.getLevel());
        for (int ii=0; ii<3; ii++) {
            logger.log(Level.FINE, ii + " " + (ii*ii));
            logger.log(Level.INFO, ii + " " + (ii*ii));
        }
    }
}

出力

Logging level is: FINER
Jun 11, 2011 9:39:23 PM LoggingLevelsBlunder main
INFO: 0 0
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 1 1
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 2 4
Press any key to continue . . .

問題文

私の例では LevelFINER というように、各ループに2つのメッセージが表示されると思っていました。 その代わり、各ループに対して1つのメッセージが表示されます( Level.FINE のメッセージが消えています)。

質問

を表示するために、何を変更する必要がありますか? FINE (, FINER または FINEST ) を出力しますか?

更新(解決)

おかげさまで Vineet Reynoldsの回答 このバージョンは私の期待通りに動作しています。 それは3つのx INFO メッセージ、および 3 x FINE のメッセージが表示されます。

import java.util.logging.*;

class LoggingLevelsBlunder {

    public static void main(String[] args) {
        Logger logger = Logger.getAnonymousLogger();
        // LOG this level to the log
        logger.setLevel(Level.FINER);

        ConsoleHandler handler = new ConsoleHandler();
        // PUBLISH this level
        handler.setLevel(Level.FINER);
        logger.addHandler(handler);

        System.out.println("Logging level is: " + logger.getLevel());
        for (int ii=0; ii<3; ii++) {
            logger.log(Level.FINE, ii + " " + (ii*ii));
            logger.log(Level.INFO, ii + " " + (ii*ii));
        }
    }
}

どのように解決するのですか?

ロガーはメッセージを記録するだけです。つまり、ログレコード(またはロギング要求)を作成します。これはハンドラによって処理されます。ロガーのレベルを設定すると、ロガーは以下のようになります。 作成 ログレコードを作成します。

を使用しているかもしれません。 ConsoleHandler (出力が System.err かファイルなのか推測できませんでしたが、前者であると仮定します) では、デフォルトでレベル Level.INFO . このハンドラを設定して、ログレコードをレベル Level.FINER 以上のログレコードを発行するように、このハンドラを設定する必要があります。

を読むことをお勧めします。 Javaログの概要 ガイドを読むことをお勧めします。このガイドでは、Logger と Handler の概念の違いについて説明しています。

ハンドラレベルの編集

1. 設定ファイルの使用

java.util.logging のプロパティファイル (デフォルトでは、これは logging.properties の中のファイルです。 JRE_HOME/lib ) を修正することで、ConsoleHandler のデフォルトレベルを変更することができます。

java.util.logging.ConsoleHandler.level = FINER

2. 実行時にハンドラを作成する

これは、グローバルな設定を上書きすることになるため、推奨されません。コード ベース全体でこれを使用すると、管理しきれないロガー構成になる可能性があります。

Handler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.FINER);
Logger.getAnonymousLogger().addHandler(consoleHandler);