81

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

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

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

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

4

5 に答える 5

71

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

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
于 2009-04-08T02:55:03.233 に答える
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 メッセージのみが含まれます。

于 2009-04-08T17:57:27.340 に答える
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行ずつやろうとしていました。

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

于 2009-05-06T14:03:20.527 に答える
3

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

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

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

  1. 何かをトラブルシューティングするために参照できる単一のファイルを作成することが目標である場合、ログ データをさまざまなファイルにまたがるのは煩わしいでしょう。問題のあるコードの実行を効果的に追跡できます。
  2. 引き続きすべてのデバッグ メッセージをログに記録すると、本番システムでログ (方法) を下げることによって得られるパフォーマンスの向上が失われます。
于 2009-04-08T02:46:59.853 に答える