48

log4j を使用して複数のログ ファイルに書き込むと、ログ メッセージが重複するという問題が発生します。

現在、ファイル内のfoobarINFOという名前の特定のロガーのレベル データ (およびそれ以上) をログに記録し、次にファイル内のすべてのロガーのすべてのレベル ログ メッセージ (およびそれ以上)をログに記録しようとしています。foo.logWARNbar.log

この結果、重複したログ メッセージがfoo.logファイルに書き込まれ (各行が 2 回記録されました)、簡単な調査の結果、これを修正するための提案log4j.additivity.foobar=falseはプロパティ ファイルに追加することであることがわかりました。

これの問題は、重複する行は停止しますが、 foobarロガーWARNからのメッセージがファイルに書き込まれないことです。bar.log

私のlog4jプロパティファイルは次のとおりです。

log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO, FOO
log4j.additivity.foobar = false

log4j.appender.FOO = org.apache.log4j.RollingFileAppender
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.FOO.File = foo.log

log4j.appender.BAR = org.apache.log4j.RollingFileAppender
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.BAR.File = bar.log

ログメッセージを両方のログファイルに書き込んで(additivityプロパティの設定を開始する前に行っていたように)、ログメッセージの重複を防ぐ方法を知っている人はいますか?

これは問題の簡単な要約であることに注意してください。実際のシナリオでは、複数のロガーと 3 つ以上のログ ファイルがあります。

4

1 に答える 1

63

この問題は 2 つの部分で解決できます。

1. ログメッセージの重複を防ぐ

rootLoggerlog4j.logger.foobarカテゴリの両方にFOOアペンダーをリストしたため、ログ メッセージは 2 回書き込まれました。したがって、アペンダーを削除して、カテゴリのログ レベルのみを定義する必要があります。

log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO

これは、log4j.logger.foobarからのINFOレベルのメッセージが、rootLogger のアペンダーあるすべてのロガーに上向きに伝搬されることを意味しますが、各ログ ファイルには 1 回だけ書き込まれます。

2. INFO レベルのメッセージが bar.log に書き込まれないようにする

log4j.logger.foobarカテゴリのすべての INFO レベル ログ メッセージは rootLogger のアペンダーによって継承されるため、 INFOレベル メッセージを記録するためにアペンダーを停止する必要があります。BAR

これは、 BARアペンダー自体にThresholdプロパティを設定することで実現できます。

log4j.appender.BAR.Threshold = WARN

これにより、INFOレベルのステートメントがbar.logファイルに記録されなくなります。これは、 WARN以上のレベルのみを受け入れるためです。

したがって、完全な log4j プロパティ ファイルは次のようになります。

log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO

log4j.appender.FOO = org.apache.log4j.RollingFileAppender
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.FOO.File = foo.log
log4j.appender.FOO.Threshold = INFO

log4j.appender.BAR = org.apache.log4j.RollingFileAppender
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.BAR.File = bar.log
log4j.appender.BAR.Threshold = WARN
于 2012-11-29T15:28:37.807 に答える