7

私は Log4j 2 に比較的慣れていません。現在、次の構成ファイルがあります。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <File name="DebugFile" fileName="../../logs/debug.log">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
    <File name="BenchmarkFile" fileName="../../logs/benchmark.log">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
  </Appenders>
  <Loggers> 
    <Logger name="com.messaging.main.ConsoleMain" level="debug">
      <AppenderRef ref="DebugFile"/>
    </Logger>
    <Logger name="com.messaging.main.ClientMain" level="debug">
      <AppenderRef ref="BenchmarkFile"/>
    </Logger>   
    <Root level="error">
      <AppenderRef ref="DebugFile"/>
    </Root>
  </Loggers>
</Configuration>

これら 2 つのクラス ConsoleMain と ClientMain で静的ロガーを介して何かをログに記録すると、

    static Logger _logger = LogManager.getLogger(ClientMain.class.getName());

    static Logger _logger = LogManager.getLogger(ConsoleMain.class.getName());

それらは常にルートロガーのアペンダーとレベルを使用します。上記のようにルート ロガーのレベルが「エラー」の場合、個々のロガーのレベルがデバッグであっても、デバッグ レベルのログ出力は表示されません。また、クラスのロガーで指定されたログ ファイルではなく、ルート ロガーで指定されたログ ファイルに常に追加されます。

そのため、ルートロガーが何らかの形ですべてをオーバーライドしているようです。クラスのアペンダーとロガーのレベルを実際に使用するようにlog4jを取得するにはどうすればよいですか?

ルートのアペンダーを削除しようとしましたが、何もログに記録されません。

ありがとうございました!

4

1 に答える 1

1

セットアップを試しましたが、問題を再現できません。使用したコードは次のとおりです。

package com.messaging.main;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class ClientMain {
    public static void main(String[] args) throws Exception {
        Logger logger = LogManager.getLogger(ClientMain.class);
        logger.debug("debug from ClientMain");
    }
}

package com.messaging.main;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class ConsoleMain {
    public static void main(String[] args) throws Exception {
        Logger logger = LogManager.getLogger(ConsoleMain.class);
        logger.debug("debug from ConsoleMain");
    }
}

正確な構成ファイルでこれらを実行すると、次の出力が得られます。

ベンチマークログ:

07:59:51.070 [main] DEBUG com.messaging.main.ClientMain - debug from ClientMain

debug.log:

07:59:51.070 [main] DEBUG com.messaging.main.ClientMain - debug from ClientMain
07:59:58.306 [main] DEBUG com.messaging.main.ConsoleMain - debug from ConsoleMain
07:59:58.306 [main] DEBUG com.messaging.main.ConsoleMain - debug from ConsoleMain

これは予期される動作です。log4j ではデフォルトで加算性が true であるため、エントリの重複は正常です。そのため、ルート ロガーと名前付きロガーの両方が同じメッセージをログに記録します ( http://logging.apache.org/log4j/2.x/manual/configuration. html#加法性)。ルート レベルが「エラー」の場合、デバッグ レベルのメッセージがログ ファイルに表示されないという報告の問題は見られません。

おそらく何か他のことが起こっています。どのバージョンの log4j2 を使用していますか (最新のものは現在 beta9 です)。また、上記の最小限のサンプル コードで問題を再現してみて、問題が引き続き発生するかどうかを確認していただけますか?

于 2013-10-07T23:07:26.897 に答える