log4j2.xmlの基本的な仕組み
Log4j2は、Javaのログ出力ライブラリであり、その設定は通常、XML形式の設定ファイルで行われます。この設定ファイルは通常 log4j2.xml
という名前で、クラスパスのルートに配置されます。
ルートロガー
log4j2.xml
の中心的な要素は <Loggers>
タグです。このタグの中には、一つの <Root>
タグと、任意の数の <Logger>
タグが含まれます。<Root>
タグは、アプリケーション全体で使用されるデフォルトのロガーを定義します。
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
上記の設定では、ルートロガーのログレベルを error
に設定し、Console
という名前のアペンダー(ログ出力先)を参照しています。
ロガー
<Logger>
タグは、特定のパッケージやクラスに対するロガーを定義します。これにより、特定の部分のログ出力レベルを細かく制御することができます。
<Loggers>
<Logger name="com.example" level="debug">
<AppenderRef ref="File"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
上記の設定では、com.example
パッケージのログレベルを debug
に設定し、File
という名前のアペンダーを参照しています。これにより、com.example
パッケージのログはファイルに出力され、その他のログはコンソールに出力されます。
以上が、log4j2.xml
の基本的な仕組みです。次のセクションでは、設定ファイルの読み込み順序と方法について説明します。
設定ファイルの読み込み順序と方法
Log4j2は、設定ファイルを読み込む際に特定の順序を持っています。この順序は以下の通りです:
- システムプロパティ
log4j.configurationFile
で指定された設定ファイル - クラスパス上の
log4j2-test.properties
- クラスパス上の
log4j2-test.yaml
またはlog4j2-test.yml
- クラスパス上の
log4j2-test.json
またはlog4j2-test.jsn
- クラスパス上の
log4j2-test.xml
- クラスパス上の
log4j2.properties
- クラスパス上の
log4j2.yaml
またはlog4j2.yml
- クラスパス上の
log4j2.json
またはlog4j2.jsn
- クラスパス上の
log4j2.xml
この順序により、テスト環境と本番環境で異なる設定を使うことが可能になります。例えば、テスト環境では log4j2-test.properties
を、本番環境では log4j2.properties
を使用するといった具体的な使い分けが可能です。
設定ファイルの読み込みは、アプリケーションの起動時に一度だけ行われます。しかし、<Configuration monitorInterval="60">
のように設定することで、設定ファイルの変更を定期的に監視し、変更があった場合に設定をリロードすることが可能です。この例では、60秒ごとに設定ファイルの変更を監視します。
以上が、log4j2.xml
の読み込み順序と方法についての説明です。次のセクションでは、設定ファイルのカスタマイズについて説明します。
設定ファイルのカスタマイズ
Log4j2の設定ファイルは、アプリケーションのログ出力を細かく制御するための強力なツールです。以下に、設定ファイルのカスタマイズの一例を示します。
アペンダーのカスタマイズ
アペンダーはログメッセージの出力先を定義します。以下に、ファイルへの出力を行うアペンダーの設定例を示します。
<Appenders>
<File name="File" fileName="logs/app.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
この設定では、logs/app.log
というファイルにログを出力します。ログメッセージのフォーマットは PatternLayout
タグで定義され、ここでは日時、スレッド名、ログレベル、ロガー名、メッセージを出力するように設定しています。
フィルタのカスタマイズ
フィルタは、特定の条件を満たすログメッセージだけを出力するためのものです。以下に、特定のログレベル以上のメッセージだけを出力するフィルタの設定例を示します。
<Logger name="com.example" level="info">
<Filter type="ThresholdFilter" level="error"/>
<AppenderRef ref="File"/>
</Logger>
この設定では、com.example
パッケージのログレベルを info
に設定していますが、ThresholdFilter
により error
レベル以上のメッセージだけが出力されます。
以上が、log4j2.xml
のカスタマイズについての説明です。次のセクションでは、AppenderとLoggerの設定について説明します。
AppenderとLoggerの設定
Log4j2では、ログの出力先(Appender)とログの生成元(Logger)を設定ファイルで管理します。以下に、それぞれの設定方法を説明します。
Appenderの設定
Appenderはログの出力先を定義します。以下に、コンソールとファイルへの出力を行うAppenderの設定例を示します。
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="File" fileName="logs/app.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
この設定では、Console
Appenderは標準出力に、File
Appenderはlogs/app.log
というファイルにログを出力します。ログメッセージのフォーマットはPatternLayout
タグで定義されています。
Loggerの設定
Loggerはログの生成元を定義します。以下に、特定のパッケージに対するLoggerの設定例を示します。
<Loggers>
<Logger name="com.example" level="info" additivity="false">
<AppenderRef ref="File"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
この設定では、com.example
パッケージのログレベルをinfo
に設定し、File
Appenderを参照しています。additivity="false"
は、このLoggerが親Loggerから継承したAppenderを使用しないことを意味します。そのため、com.example
パッケージのログはファイルにのみ出力され、その他のログはコンソールに出力されます。
以上が、AppenderとLoggerの設定についての説明です。次のセクションでは、レイアウトの指定について説明します。
レイアウトの指定
Log4j2では、ログメッセージのフォーマットをレイアウトとして定義します。以下に、PatternLayout
を使用したレイアウトの設定例を示します。
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
この設定では、ログメッセージのフォーマットをPatternLayout
タグで定義しています。パターン文字列"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"
は、ログメッセージの各部分をどのように表示するかを指定します。
%d{HH:mm:ss.SSS}
: 日付と時刻。HH:mm:ss.SSS
の形式で表示します。[%t]
: スレッド名。[]
で囲まれて表示します。%-5level
: ログレベル。5文字分の幅を確保して左寄せで表示します。%logger{36}
: ロガー名。最大36文字分を表示します。%msg
: ログメッセージ。%n
: 改行。
以上が、レイアウトの指定についての説明です。次のセクションでは、子Loggerの使用について説明します。
子Loggerの使用
Log4j2では、Loggerの階層構造を利用することができます。これにより、特定のパッケージやクラスに対するログ出力設定を、より細かく制御することが可能になります。
以下に、子Loggerの設定例を示します。
<Loggers>
<Logger name="com.example" level="info">
<AppenderRef ref="File"/>
</Logger>
<Logger name="com.example.sub" level="debug">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
この設定では、com.example
パッケージのログレベルをinfo
に設定し、File
Appenderを参照しています。また、その子パッケージであるcom.example.sub
のログレベルをdebug
に設定し、Console
Appenderを参照しています。
このように、子Loggerを使用することで、特定のパッケージやクラスに対するログ出力設定を親Loggerから独立させることができます。これにより、ログ出力の粒度を細かく制御することが可能になります。
以上が、子Loggerの使用についての説明です。次のセクションでは、具体的な使用例とその効果について説明します。