ルート ロガーを TRACE レベル (すべてのメッセージ) にし、コンソールに ThresholdFilter を配置して、一部のメッセージのみがコンソールに表示されるようにすることができます。
この構成では、エラー メッセージのみがコンソールに記録され、同時にすべてのメッセージ (TRACE、DEBUG、INFO、ERROR...) が debug.txt ファイルに記録されます。エラー以上のメッセージは、コンソールとファイルの両方に記録されます。
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="ERROR">
<appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d %-5p %C{2} (%F:%L) - %m%n" />
</Console>
<File name="DEBUG_FILE" fileName="debug.txt">
<PatternLayout pattern="%d %-5p %C{2} (%F:%L) - %m%n" />
</File>
</appenders>
<loggers>
<root level="trace">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
</root>
</loggers>
</configuration>
ところで、パターン レイアウトには位置情報を必要とする変換パターン (正確には%C、%F、および %L ) が含まれていることに注意してください。これは、すべてのログ メッセージに対して、log4j2 がスタックのスナップショットを取得し、スタック トレースをたどって、ログを記録したクラスとメソッドを見つける必要があることを意味します。
これは非常に遅いです。
ロギングは、同期ロギングの場合は 2 ~ 5 倍遅くなり、非同期ロギングの場合は 4 ~ 20 倍遅くなります。
パフォーマンスが問題にならない場合は問題ありませんが、注意が必要なことは間違いありません。個人的には %c (ロガー名) を使用するだけで、アプリのログ メッセージは一意であるため、メッセージの送信元をすぐに見つけることができます。ちょうど私の2セント。
--- 2013-04-27 を更新 --- それ以来、これを行うためのより簡単な方法を学びました。appender-ref でレベルを設定できます。
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="debug">
<appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p %c{2} - %m%n" /> <!--without location-->
</Console>
<File name="DEBUG_FILE" fileName="debug.txt">
<PatternLayout pattern="%d %-5p %c{2} - %m%n" />
</File>
</appenders>
<loggers>
<root level="debug">
<appender-ref ref="CONSOLE" level="ERROR" />
<appender-ref ref="DEBUG_FILE" />
</root>
</loggers>
</configuration>