Log4jレベルの例 - 順序、優先順位、カスタムフィルター
log4jを使用したことがある場合、メッセージをログに記録するための多くのメソッドがあることに気付くでしょう。例えば:
logger.trace("My Log message");
logger.debug("My Log message");
logger.info("My Log message");
実際、それらはlog4jレベルに対応しています。
Log4j レベル
Log4j は多くのログレベルを提供します。以下は完全なリストです。
- TRACE: TRACE レベルは DEBUG よりも詳細な情報イベントを指定します。
- デバッグ: デバッグレベルは、アプリケーションのデバッグに最も役立つ詳細な情報イベントを指定します。
- 情報: INFOレベルは、アプリケーションの進行状況を粗い粒度で強調する情報メッセージを指定します。
- 警告: WARNレベルは、潜在的に危険な状況を示します。
- エラー: エラーレベルは、アプリケーションが引き続き動作する可能性があるエラーイベントを指定します。
- 致命的: 致命的レベルは、アプリケーションが中止することが予想される非常に重大なエラーイベントを指定します。
- すべて: ALLは最も低いランクであり、すべてのログをオンにすることを目的としています。
- オフ: オフは最高のランクを持ち、ログ記録を無効にすることを目的としています。
ALLとOFFは特別なログレベルであり、極端な状況でのみ使用するべきです。私はこれまでにこれらを個人的に使用したことはありません。
Log4jのレベル順/優先順位
トレースは最低優先度で、フェイタルは最高優先度です。以下は log4j のログレベルの順序です。トレース < デバッグ < 情報 < 警告 < エラー < フェイタル。ロガーレベルを定義すると、優先度が高いログも印刷されます。たとえば、ロガーレベルが INFO の場合、デバッグログは印刷されませんが、優先度が高いため警告ログは印刷されます。
Log4j フィルター
INFOとFATALイベントのみをログに記録し、WARNとERRORイベントは記録しないとしましょう。このようなシナリオでは、log4jフィルターの助けを借りることができます。org.apache.log4j.spi.Filterクラスを拡張し、独自のフィルタリング機能を提供するためにdecide(LoggingEvent event)メソッドを実装することができます。
package com.journaldev.log4j.filters;
import org.apache.log4j.Level;
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;
public class MyLog4jFilter extends Filter {
/**
* My custom filter to only log INFO and FATAL events
*/
@Override
public int decide(LoggingEvent event) {
if(event.getLevel() == Level.INFO || event.getLevel() == Level.FATAL)
return ACCEPT;
else return DENY;
}
}
上記のカスタムフィルターはINFOおよびFATALイベントのみをログに記録します。以下は、このためのXML log4j設定です。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="https://jakarta.apache.org/log4j/"
debug="false">
<!-- console appender -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
</layout>
<filter class="com.journaldev.log4j.filters.MyLog4jFilter" />
</appender>
<logger name="com.journaldev.log4j" additivity="false">
<level value="TRACE" />
<appender-ref ref="console" />
</logger>
<root>
<priority value="DEBUG" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
コンソールアペンダーでのフィルタークラスの使い方に注意してください。以下は基本的なログ記録を行うシンプルなクラスです。
package com.journaldev.log4j.main;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;
public class Log4jExample {
static {
init();
}
private final static Logger logger = Logger.getLogger(Log4jExample.class);
public static void main(String[] args) {
logger.trace("My Trace Log");
logger.debug("My Debug Log");
logger.info("My Info Log");
logger.warn("My Warn Log");
logger.error("My error log");
logger.fatal("My fatal log");
}
/**
* method to init log4j configurations
*/
private static void init() {
DOMConfigurator.configure("log4j.xml");
}
}
このプログラムを実行すると、以下のログがコンソールに生成されます。
INFO Log4jExample - My Info Log
FATAL Log4jExample - My fatal log
独自のカスタムフィルタークラスを作成することによって、さらに複雑なフィルタリングを行うことができます。この特定のケースでは、以下のアペンダーに示すように、org.apache.log4j.varia.LevelMatchFilterおよびorg.apache.log4j.varia.DenyAllFilterクラスを使用できます。
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelMatchFilter">
<param name="LevelToMatch" value="INFO" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.LevelMatchFilter">
<param name="LevelToMatch" value="FATAL" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>
私たちには、特定の範囲外の優先度を持つメッセージを拒否するために使用できる org.apache.log4j.varia.LevelRangeFilter クラスもあります。これで、log4j のレベルとフィルターの概要は終了です。 参考文献:
- Log4jレベルAPI
- Log4j カスタムフィルター StackOverflow
