Log4j2 は、Java アプリケーションにおける堅牢で柔軟なロギングフレームワークです。以下に、その基本構成要素と実用的な設定方法を解説します。
1. 主要コンポーネントの概要
Logger
ロギング機能の入口であり、LogManager.getLogger(...) により取得します。各クラスには固有の Logger インスタンスを割り当てるのが一般的です。同じ名前で取得した場合、内部では同一のインスタンスを返します。
LogLevel
ログレベルは TRACE < DEBUG < INFO < WARN < ERROR < FATAL の順で深刻度が高くなります。あるレベルを設定すると、それ以上のレベルのログが出力対象になります。
INFO:通常の業務フローの記録DEBUG:開発・デバッグ用の詳細情報TRACE:極めて詳細なトレース出力ERROR:回復不能ではないエラーFATAL:アプリケーション終了を強いられる重大エラー
Appender
ログ出力先を定義します。代表的なものに以下があります:
- コンソール出力(
ConsoleAppender) - ファイル出力(
FileAppender) - ローテーション付きファイル出力(
RollingFileAppender) - ネットワーク送信、データベース等
各 Appender には PatternLayout、ThresholdFilter などを設定可能で、出力フォーマットやレベル制御が可能です。
Additivity
logger に属するログが、親の logger にも伝播するかどうかを制御します。デフォルトは true であり、意図せず重複出力する場合は additivity="false" を明示的に指定します。
Layout
出力形式を制御します。代表的なフラグは以下の通りです:
%d{pattern}:日時(例:%d{HH:mm:ss.SSS})%t:スレッド名%p/%level:ログレベル%c/%logger:Logger 名%m/%msg:ログメッセージ本体%n:改行%F/%file:ソースファイル名%L/%line:行番号%M/%method:メソッド名
2. 基本的なセットアップ手順
log4j-api-2.x.jarとlog4j-core-2.x.jarをクラスパスへ追加- optionally、カスタム設定ファイル(例:
log4j2.xml)をクラスパス直下に配置 - 必要に応じて、コンソール/ファイル出力の制御やローテーション設定を行う
設定ファイルが存在しない場合、Log4j2 は内部で DefaultConfiguration を適用し、エラーレベル以上をコンソールへ発行します。
3. サンプルコードと設定例
単一の Logger 使用(自動推奨設定)
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SampleApp {
private static final Logger log = LogManager.getLogger(SampleApp.class);
public static void main(String[] args) {
log.trace("Tracing entry point");
log.debug("Debugging configuration");
log.info("Application started");
log.warn("Warning: low disk space");
log.error("Error: koala");
log.fatal("Fatal crash detected");
}
}
設定ファイルなしの場合:
ERROR StatusLogger No log4j2 configuration file found... [INFO] 出力なし [ERROR] SampleApp - Error: koala [FATAL] SampleApp - Fatal crash detected
複数 Logger の同時に使用と additivity 動作確認
// Foo.java
public class Foo {
private static final Logger logger = LogManager.getLogger(Foo.class);
public static void run() {
logger.trace("Foo trace");
logger.error("Foo error");
}
}
// SampleApp.java
public class SampleApp {
private static final Logger log = LogManager.getLogger(SampleApp.class);
public static void main(String[] args) {
log.error("Main error");
Foo.run();
}
}
出力結果(logger 層別):
SampleAppの Logger 名:"SampleApp"Fooの Logger 名:"Foo"
XML 設定による出力制御(log4j2.xml)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %C{1} - %msg%n"/>
</Console>
<File name="ERR_FILE" fileName="logs/error.log">
<PatternLayout pattern="%d{ISO8601} %p [%t] %C.%M(%L) - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Logger name="com.example.Foo" level="TRACE" additivity="false">
<AppenderRef ref="STDOUT"/>
</Logger>
<Root level="ERROR">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="ERR_FILE"/>
</Root>
</Loggers>
</Configuration>
この設定では:
com.example.Fooの Logger は TRACE 以上をコンソールに出力(Root に伝播しない)Rootは ERROR 以上をコンソール+ファイルへ
ログ例:
14:23:05.123 [main] TRACE Foo - Foo trace 14:23:05.124 [main] ERROR SampleApp - Main error 14:23:05.125 [main] ERROR Foo - Foo error
一方、ERR_FILE には:
2025-04-05 14:23:05,124 ERROR [main] SampleApp.main(10) - Main error 2025-04-05 14:23:05,125 ERROR [main] Foo.run(6) - Foo error
動的ファイルローテーション(RollingFile)
<RollingFile name="RollingApp"
fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{HH:mm:ss} %p %c{1.} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
</RollingFile>
この設定により、日々のローテーションと 50 MB 超 presenting 時の gzip 圧縮アーカイブが自動実行されます。
カスタム Logger のオーバーライド(overwrite 指定)
<File name="FooDebugFile" fileName="logs/foo_debug.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} | %5p | %c | %m%n"/>
</File>
上記設定のファイルは起動毎にクリアされ、最新実行のみを記録します。
Webアプリケーション向け特別設定
Servlet 3.0+ 環境(Tomcat 7.0.43+)では、追加モジュールとして log4j-web を含める必要があります。また、以下のように web.xml でコンテキスト名や設定パスを明示可能です:
<context-param>
<param-name>log4jContextName</param-name>
<param-value>demo-web</param-value>
</context-param>
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/log4j2.xml</param-value>
</context-param>
またファイル出力パスには、${web:rootDir} を使うことで Web アプリケーション_root からの相対パスが指定できます:
<File name="ACCESS_LOG" fileName="${web:rootDir}/logs/access.log"/>