1行まとめ
Log4j 2 でカスタムログレベルを導入する場合は、 category = Level.CATEGORY
の Plugin
を作るのがオススメです。
背景
Log4j2 には FATAL
, ERROR
, WARN
, INFO
, DEBUG
, TRACE
というレベルが用意されています。
これら以外のカスタムログレベルを使う方法も Log4j2 に用意されており、公式ドキュメントで解説されています。
https://logging.apache.org/log4j/2.x/manual/customloglevels.html
公式ドキュメントの方法でカスタムログレベルを扱うことができるようになるのですが、ちょっと冗長というか、カスタムログレベルの定義を 2 箇所 (Java と log4j2.xml) に記載している点に違和感があります。一方だけで済むのでは? と感じてしまいます。
実際、Java 側の記載だけで済む方法があるのですが、なぜか公式ドキュメントに記載がないため、ここにメモを残します。
解決方法
Java コードでカスタムログレベルを定義します。ポイントは 3 点です。
- カスタムログレベルを static フィールドに定義したクラスを作ること
- Log4j 2 の Plugin (
org.apache.logging.log4j.core.config.plugins.Plugin
) にすること - Plugin の
category
をLevel.CATEGORY
にすること
@Plugin(name = "MyCustomLevel", category = Level.CATEGORY)
public class CustomLevel {
public static final Level INFO2 = Level.forName("INFO2", 375);
public static final Level INFO3 = Level.forName("INFO3", 350);
public static final Level INFO4 = Level.forName("INFO4", 325);
}
log4j2.xml
を記載します。
ポイントは CustomLevels
の記載を不要にできることです。(公式ドキュメントの記載から CustomLevels
をコメントアウトしています)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="CONSOLE">
<PatternLayout pattern="%d [%t] %p %c - %m%n"/>
</Console>
</Appenders>
<!-- 記載不要
<CustomLevels>
<CustomLevel name="INFO2" intLevel="375"/>
<CustomLevel name="INFO3" intLevel="350"/>
<CustomLevel name="INFO4" intLevel="325"/>
</CustomLevels>
-->
<Loggers>
<Logger name="com.example" level="DEBUG"/>
<Root level="INFO2">
<AppenderRef ref="CONSOLE" level="WARN"/>
</Root>
</Loggers>
</Configuration>
ビルドツールに Gradle を使っている場合は、 dependencies
に annotationProcessor
を加えます。
dependencies {
annotationProcessor('org.apache.logging.log4j:log4j-core:2.24.3')
}
(詳しくは https://logging.apache.org/log4j/2.x/manual/plugins.html を参照。Maven 向けの設定も記載されています)
以上により、
- カスタムログレベルの定義は Java だけで済みます。(log4j2.xml での定義が不要になります)
- log4j2.xml でカスタムログレベルを使用できます。
仕組みの解説
機会や要望があれば、後で書きます。