log4jを使用して異なるコンテンツの複数のログファイルを作成する


81

さまざまなレベルのログをさまざまなアペンダーに出力するようにlog4jを構成する方法はありますか?

複数のログファイルを設定しようとしています。メインログファイルは、すべてのクラスのすべてのINFO以上のメッセージをキャッチします。(開発中は、すべてのDEBUG以上のメッセージをキャッチし、特定のクラスのTRACEをキャッチします。)

次に、別のログファイルが必要です。そのログファイルは、クラスの特定のサブセットのすべてのDEBUGメッセージをキャッチし、他のクラスのすべてのメッセージを無視します。

私が求めているものを手に入れる方法はありますか?

ありがとう、ダン

java  log4j 

3
1つのログファイルでDEBUGとDEBUGのみをキャプチャし、別のログファイルでINFOとINFOのみをキャプチャするなどのことを意味しますか?
エディ

回答:


70

これで始められるはずです:

log4j.rootLogger=QuietAppender, LoudAppender, TRACE
# setup A1
log4j.appender.QuietAppender=org.apache.log4j.RollingFileAppender
log4j.appender.QuietAppender.Threshold=INFO
log4j.appender.QuietAppender.File=quiet.log
...


# setup A2
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender
log4j.appender.LoudAppender.Threshold=DEBUG
log4j.appender.LoudAppender.File=loud.log
...

log4j.logger.com.yourpackage.yourclazz=TRACE

3
最後の行は何をしますか?
djangofan 2012年

1
@djangofanは、カスタムパッケージ/クラスログレベル(つまり、TRACEロギングを使用したcom.yourpackage.yourclazz)を設定しますが、この場合はすでにデフォルト(1行目で設定)であるため、何も実行されません。rootLoggerにINFOがあり、「yourclass」にDEBUGがある場合、IMOのこの例の方が適しています。
トムクリフト2012年

最初の行のパラメーターは、TRACE、QuietAppender、LoudAppenderであり、QuietAppender、LoudAppender、TRACEではありません
Richard Whitehead

26

おそらくこのようなものですか?

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 <!-- general application log -->
 <appender name="MainLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="server.log" />
  <param name="Threshold" value="INFO" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender> 
 <!-- additional fooSystem logging -->
 <appender name="FooLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="foo.log" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender>
 <!-- foo logging -->
 <logger name="com.example.foo">
  <level value="DEBUG"/>
  <appender-ref ref="FooLogFile"/>
 </logger>
 <!-- default logging -->
 <root>
  <level value="INFO"/>
  <appender-ref ref="MainLogFile"/>
 </root>
</log4j:configuration>

したがって、すべての情報メッセージはserver.logに書き込まれます。対照的に、foo.logには、デバッグレベルのメッセージを含むcom.example.fooメッセージのみが含まれます。


com.example.fooはパッケージですか、それともクラスですか?
WowBow 2015年

1
@WowBowどちらでもかまいませんが、そのような名前の場合はパッケージのように見えます。ロガーにクラス名を使用することは単なる慣例です
araqnid 2015年

ありがとう。私は両方を求めて働いた後、両方を試しました;)
WowBow 2015年

7

この質問がありましたが、ひねりを加えて、さまざまなコンテンツをさまざまなファイルに記録しようとしていました。LowLevelデバッグログとHighLevelユーザーログの情報がありました。LowLevelが1つのファイルのみに移動し、HighLevelがファイルとsyslogdの両方に移動するようにしたかったのです。

私の解決策は、3つのアペンダーを構成してから、次のようにログを設定することでした。

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

log4j.logger.HighLevel=ALL,Syslog,HighLogger
log4j.additivity.HighLevel=false

私が理解するのが難しい部分は、「log4j.logger」に複数のアペンダーがリストされている可能性があることでした。私は一度に1行ずつそれをやろうとしていました。

これがいつか誰かに役立つことを願っています!


3

メインのログファイル/アペンダーには、 .Threshold = INFO、ロガーでDEBUG、TRACEなどが有効になっているかどうかに関係なく、アペンダーに実際に記録される内容をINFO以上に制限するようにます。

DEBUGをキャッチすることに関しては、それ以上のものはありません...おそらくカスタムアペンダーを作成する必要があります。

ただし、トラブルシューティングと分析がかなり難しくなるように思われるため、これを行わないことをお勧めします。

  1. トラブルシューティングを行うことができる単一のファイルを作成することが目標である場合、ログデータをさまざまなファイルにまたがるのは面倒です。非常に管理されたログポリシーがない限り、DEBUGとINFOの両方のコンテンツが必要になる可能性があります。問題のあるコードの実行を効果的に追跡できます。
  2. すべてのデバッグメッセージを引き続きログに記録することにより、ログ記録(方法)を下げることによって本番システムで通常得られるパフォーマンスの向上が失われます。

私は自分の目標をもっとよく説明すべきだった。メインログは、アプリ内の任意の場所でエラーや異常な状態などを追跡するためのものです。このログは小さく保つ必要があるため、定期的にロールオーバーされます。特別なログは1つのサブシステムの動作を追跡し、長期間保持する必要があります。

2番目のログファイルからERROR、WARN、INFOメッセージを除外しますか?
マットb

XMLでは、次のようにパラメーターThresholdを追加できます。<appender name = "ERROR_FILE"> <param name = "Threshold" value = "ERROR" /> </ appender>
かみそり

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.