私のプログラムにはjava.util.logging.Logger
がログインしています。 1つのクラスに対してFINE
のログを有効にするにはどうすればいいですか?他のすべてのクラスではWARNING
に設定しますか?単一のJavaクラスに対してFINEログを有効にする方法
追加のプロパティファイルを設定する必要はなく、私のmain()
メソッドでこれをプログラマチックに行うことをお勧めします。
私のプログラムにはjava.util.logging.Logger
がログインしています。 1つのクラスに対してFINE
のログを有効にするにはどうすればいいですか?他のすべてのクラスではWARNING
に設定しますか?単一のJavaクラスに対してFINEログを有効にする方法
追加のプロパティファイルを設定する必要はなく、私のmain()
メソッドでこれをプログラマチックに行うことをお勧めします。
Logger log = Logger.getLogger(this.getClass().getName()).setLevel(Level.FINE);
それは近いですが、2つの理由で動作しません: 1)コードを私のメインクラスに入れたいので、私のユーティリティクラスのすべてのユーザーがFINEロギングを見る必要はありません。 2)私があなたが提案したことをしても、ハンドラはまだ私のすべてのFINEメッセージを飲み込んでいるようです。 –
私はトリックを行う必要があります警告コードベースの残りの他のすべてのLogger
秒を維持しながら、あなたは、FINEにごHandler
とあなたの特定のクラスLogger
のためにあなたのログレベルを設定することができると信じています。 Logger
とHandler
の両方とも、メッセージを記録するためにレベルフィルタを渡す必要があります。
問題の単一のクラスごとにロガーを定義するのではなく、クラス間でロガーを共有したい場合は、独自のフィルタリング方法を持つ独自のjava.util.logging.Handlerを実装することもできますLogRecord.getSourceClassName()で提供される情報を使用してクラス名を取得します。
これは実際に動作しているメールクラスに追加した方法です。私はまだ他人からの改善を歓迎する。
private static void setupLogging() {
// To enable FINE logging in a single class, apparently this bewildering
// maze of statements is required.
Logger.getLogger("").setLevel(Level.FINE);
for (Handler handler : Logger.getLogger("").getHandlers()) {
handler.setLevel(Level.FINE);
}
MyOtherClass.logger.setLevel(Level.FINE);
Logger.getLogger("").setLevel(Level.WARNING);
}
私はOPがこれをプログラム的に行うように求められていることは知っていますが、プロパティファイルでもこれを行う方法の例があります。
警告:ヘッダーはプログラムによって示されておらず、多くの開発者がlogging.propertiesを使用して管理する必要があるため、インクルードする価値があると思いました。また、これについて実際に多くのオンラインではない、それは混乱し、log4jと少し違うことがあります
.level
設定で示されています。これは、デフォルトでどのイベントがキャプチャされ、ログ用に配信されるかを指示します。ルートロギングレベルは、ロギング階層の「ルートロガー」によって使用されるレベルです。 this onjava article for more info on the logging hierarchyを参照してください。
以下では、ルートログレベルはWARNINGに設定されているため、通常はWARNINGイベントのみを取得します。これは、階層内のすべての子ロガーによって継承されますが、それ以外の場合は設定しない限り、(それ以降):
.level=WARNING
このルートログレベルは「分散」されているものではない、捕獲されたものを示しています。キャプチャされたイベント(メッセージ)がどのように配信されるかは、ロガーに関連付けられているハンドラまでです。たとえば、ConsoleHandlerはイベントをコンソールに出力します。例:
java.util.logging.ConsoleHandler.level = WARNING
このConsoleHandler.levelは、このハンドラがメッセージを配布または印刷するレベルを示します。したがって、FINEメッセージが上記の設定で受信された場合、このハンドラはそれを印刷しません。それは、しかし、警告レベル以上のすべてのメッセージを印刷します。 ALLに設定
は(我々はまた、すべてがキャプチャされることを保証するために、ルートレベルを設定する必要があります)ConsoleHandlerは、コンソールにすべてのメッセージが出力されますことを保証します:
.level=ALL
java.util.logging.ConsoleHandler.level = ALL
しかし、これは多くを作成します私たちも望んでいない騒音のだから、私たちが興味を持っているこれらのクラスにFINEレベルのイベントを減らすために、我々は唯一のそれらの特定のロガーのログレベルを変更します。
com.level = WARNING
com.mypackage.MyClass1.level = FINE
com.mypackage.MyClass2.level = FINE
com.mypackage.mysubpackage.MyClass3.level = FINE
注上記で、私はのためにレベルを明示的に設定したことを「com」ロガーをWARNINGに設定します。
基本的にはhttp://stackoverflow.com/questions/470430/java-util-logging-logger-doesnt-respect-java-util-logging-levelと同じ質問です。 –