web-dev-qa-db-ja.com

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

Log4jを設定して、異なるレベルのロギングを異なるアペンダーに出力する方法はありますか?

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

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

私が望んでいるものを取得する方法はありますか?

ありがとう、ダン

81
Daniel

これで開始できます。

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
70
jasonnerothin

おそらくこんな感じ?

<!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メッセージのみが含まれます。

26
araqnid

この質問はありましたが、ひねりを加えて-さまざまなコンテンツをさまざまなファイルに記録しようとしていました。 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行ずつ実行しようとしていました。

これが誰かの助けになることを願っています!

7
Kieveli

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

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

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

  1. 何かのトラブルシューティングを行うことができる単一のファイルを作成することが目標である場合、ログデータをさまざまなファイルに分散させるのは面倒です。問題のあるコードの実行を効果的に追跡できます。
  2. すべてのデバッグメッセージを引き続きログに記録することにより、ログ(ウェイ)を下げることにより、運用システムで通常得られるパフォーマンスの向上を失います。
3
matt b

デモリンク: https://github.com/RazvanSebastian/spring_multiple_log_files_demo.git

私のソリューションは、spring-boot-starter-log4jを使用したXML構成に基づいています。この例は、spring-boot-starterと2つのLoggerが異なるログファイルに書き込む基本的な例です。

0
Rzv Razvan