1. ホーム
  2. java

[解決済み] プログラムによるLog4jロガーの設定

2022-04-19 08:14:01

質問

SLF4Jを使おうとしています( log4j バインディング) を初めて使用します。

私は、異なるレベルのログを記録し、異なるアペンダーにメッセージをプッシュするLoggerFactoryによって返される3つの異なる名前のロガーを構成したいと思います。

  • ロガー1 "FileLogger"はDEBUGを記録し、以下の場所に追記します。 DailyRollingFileAppender
  • ロガー2 "TracingLogger"はTRACE+のログを記録し JmsAppender
  • Logger 3 "ErrorLogger"は、ERROR+を記録し、別の JmsAppender

さらに、プログラムで設定したい(XML や log4j.properties ファイル)を作成します。

通常であれば、これらを定義すると想像します。 Logger のように、ブートストラップコードのどこかで init() メソッドを使用します。しかし、私が使いたいのは slf4j-log4j ロガーを定義し、クラスパスで利用できるようにする場所について、私は混乱しています。

私は 信じる なぜなら、SLF4J API を使用する私のコードは、これらのロガーが存在することを決して知ることがないからです。私のコードは、SLF4J APIに通常の呼び出しを行い、クラスパスで見つけたlog4j Loggersに転送するだけです。

しかし、クラスパス上のこれらのlog4j Loggersをどのように設定するのでしょうか...Javaで?

解決方法は?

Log4jにプログラム的にAppenderを追加/削除することができます。

  ConsoleAppender console = new ConsoleAppender(); //create appender
  //configure the appender
  String PATTERN = "%d [%p|%c|%C{1}] %m%n";
  console.setLayout(new PatternLayout(PATTERN)); 
  console.setThreshold(Level.FATAL);
  console.activateOptions();
  //add appender to any Logger (here is root)
  Logger.getRootLogger().addAppender(console);

  FileAppender fa = new FileAppender();
  fa.setName("FileLogger");
  fa.setFile("mylog.log");
  fa.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n"));
  fa.setThreshold(Level.DEBUG);
  fa.setAppend(true);
  fa.activateOptions();

  //add appender to any Logger (here is root)
  Logger.getRootLogger().addAppender(fa);
  //repeat with all other desired appenders

init()のどこかに、これが他の何よりも先に実行されることが確実なものを入れておくといいと思います。 そして、ルートロガーにある既存のアペンダーをすべて削除するには

 Logger.getRootLogger().getLoggerRepository().resetConfiguration();

を追加することから始めてください。もちろん、これが動作するためには、クラスパスにlog4jが必要です。

備考

任意の Logger.getLogger(...) を選択し、アペンダーを追加します。私はルートロガーを取りましたが、これはすべてのものの底にあり、他のカテゴリのアペンダーを通過するすべてのものを処理するからです(additivityフラグを設定することによって他の構成がない限り)。

ロギングがどのように機能し、ログがどこに書き込まれるかがどのように決定されるかを知る必要がある場合 このマニュアルを読む をご覧ください。

要するに

  Logger fizz = LoggerFactory.getLogger("com.fizz")

は、カテゴリ "com.fizz"のロガーが得られます。

上記の例では、これで記録されたものはすべて、ルート logger のコンソールとファイルアペンダに参照されることを意味します。

にアペンダーを追加した場合 Logger.getLogger("com.fizz").addAppender(newAppender) からのロギングは fizz は、ルート ロガーのアペンダーと newAppender .

設定によってロガーを作成するのではなく、システムで考えられるすべてのカテゴリーに対してハンドラーを提供するだけです。