Log4jのレベルの例 – 順番、優先度、カスタムフィルター
もしもあなたがlog4jを使用したことがあるなら、メッセージをログに出力するための多くのメソッドがあることに気付くでしょう。例えば:
logger.trace("My Log message");
logger.debug("My Log message");
logger.info("My Log message");
実際には、それらはlog4jのレベルに対応しています。 (Jissai ni wa, sorera wa log4j no reberu ni taishō shiteimasu.)
ログ4jのレベル
Log4jは多くのログレベルを提供しています。以下に完全な一覧を示します。
-
- トレース:トレースレベルはデバッグよりも詳細な情報イベントを指定します。
-
- デバッグ:デバッグレベルはアプリケーションのデバッグに最も役立つ細かい情報イベントを指定します。
-
- 情報:情報レベルはアプリケーションの進行状況を荒いレベルで示す情報メッセージを指定します。
-
- 警告:警告レベルは潜在的に有害な状況を指定します。
-
- エラー:エラーレベルはアプリケーションが継続的に実行可能なエラーイベントを指定します。
-
- 致命的:致命的レベルは非常に深刻なエラーイベントを指定し、アプリケーションの中止を想定しています。
-
- 全て:全ては最も低いランクを持ち、すべてのログ記録を有効にするために使用されます。
- オフ:オフは最も高いランクを持ち、ログ記録を無効にするために使用されます。
ALLとOFFは特別なログレベルであり、極めて特殊な状況でのみ使用すべきです。私自身はこれらを一度も使用したことがありません。
Log4j レベルの順序/優先度
トレースは最低の優先度であり、ファタルは最高の優先度です。以下はlog4jのログレベルの順序です。トレース < デバッグ < インフォ < 警告 < エラー < ファタル。ロガーレベルを定義する際、より高い優先度のログも出力されます。例えば、ロガーレベルがインフォの場合、デバッグログは出力されませんが、警告ログは優先度が高いため出力されます。
Log4jフィルター
INFOとFATALのイベントのみを記録したい場合、WARNとERRORのイベントは記録しないようにしたいとします。このような場合、log4jのフィルターを利用することができます。org.apache.log4j.spi.Filterクラスを拡張し、カスタムのフィルタリング機能を提供するために、そのdecide(LoggingEvent event)メソッドを実装することができます。
package com.scdev.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.scdev.log4j.filters.MyLog4jFilter" />
</appender>
<logger name="com.scdev.log4j" additivity="false">
<level value="TRACE" />
<appender-ref ref="console" />
</logger>
<root>
<priority value="DEBUG" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
コンソールアペンダー内でFilterクラスの使用に注意してください。以下は基本的なロギングを行うシンプルなクラスです。
package com.scdev.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 Level API
- Log4j Custom Filter StackOverflow