Java ロギング: Log4j2 の実践的導入

Log4j2 は、Java アプリケーションにおける堅牢で柔軟なロギングフレームワークです。以下に、その基本構成要素と実用的な設定方法を解説します。

1. 主要コンポーネントの概要

Logger

ロギング機能の入口であり、LogManager.getLogger(...) により取得します。各クラスには固有の Logger インスタンスを割り当てるのが一般的です。同じ名前で取得した場合、内部では同一のインスタンスを返します。

LogLevel

ログレベルは TRACE < DEBUG < INFO < WARN < ERROR < FATAL の順で深刻度が高くなります。あるレベルを設定すると、それ以上のレベルのログが出力対象になります。

  • INFO:通常の業務フローの記録
  • DEBUG:開発・デバッグ用の詳細情報
  • TRACE:極めて詳細なトレース出力
  • ERROR:回復不能ではないエラー
  • FATAL:アプリケーション終了を強いられる重大エラー

Appender

ログ出力先を定義します。代表的なものに以下があります:

  • コンソール出力(ConsoleAppender
  • ファイル出力(FileAppender
  • ローテーション付きファイル出力(RollingFileAppender
  • ネットワーク送信、データベース等

各 Appender には PatternLayoutThresholdFilter などを設定可能で、出力フォーマットやレベル制御が可能です。

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. 基本的なセットアップ手順

  1. log4j-api-2.x.jarlog4j-core-2.x.jar をクラスパスへ追加
  2. optionally、カスタム設定ファイル(例: log4j2.xml)をクラスパス直下に配置
  3. 必要に応じて、コンソール/ファイル出力の制御やローテーション設定を行う

設定ファイルが存在しない場合、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"/>

タグ: log4j2 java-logging appender logger configuration

5月28日 01:09 投稿