1. ホーム
  2. java

JULからSLF4Jブリッジ

2023-10-09 09:42:42

質問

私は現在、サードパーティライブラリ(すなわち restfb)が java.util.logging を使用していることを観察しており、私の logback.xml に設定された SLF4J コンソールアペンダがないにもかかわらず、これらのログが STDOUT に終了するのを見ています。また、私は jul-to-slf4j ブリッジをクラスパスに持っています。jul-to-slf4jブリッジは、ブリッジがインストールされているときにlogbackによって構成されたアペンダーにのみログを記録しますか、それともstdoutにもログを記録しますか?

どのように解決する?

以下のように SLF4JBridgeHandler.install() . また、java.util.loggingのルートロガー(以下の抜粋の理由)ですべてのログレベルを有効にし、デフォルトのコンソールアペンダーを削除する必要があります。

このハンドラは、julのログをSLF4Jにリダイレクトします。ただし、j.u.l.で有効になっているログのみ ただし、j.u.l.で有効になっているログのみリダイレクトされます。例えば、あるログステートメント が j.u.l. logger を無効にしている場合、そのステートメントは、定義により、SLF4JBB のいずれにも到達しません。 SLF4JBridgeHandler インスタンスに到達せず、リダイレクトされません。

全体のプロセスは次のように実現できます。

import java.util.logging.Logger;
import org.slf4j.bridge.SLF4JBridgeHandler;

SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
Logger.getLogger("").setLevel(Level.FINEST); // Root logger, for example.

パフォーマンス上の理由から、レベルを finest よりも高いものに設定することは可能ですが、これらのログを有効にしない限りは java.util.logging で有効にしなければ、これらのログを有効にすることはできません (上記の抜粋で述べた理由から)。