Log4j2 Properties形式の設定ファイル¶
ステップ・バイ・ステップ¶
まずはLog4j2の設定をステップ・バイ・ステップで見ていきます。
log4j2の内部ログ出力¶
log4j2のライブラリ内部のロギングを制御します。log4j2がうまく動かない時(設定ファイルの記述ミスの調査)などに内部ログを参照します。
- log4j2.properties
status = error dest = err
- status にはlog4j2ライブラリ内部のロギングのレベルを指定します。
trace | debug | info | warn | error | fatal
- dest にはlog4j2ライブラリ内部のロギングの出力先を指定します。
err | out | ファイルパス | URL
設定名¶
設定自体に名称を付けます。
- log4j2.properties
name = MyAppConfig
コンソール出力(アペンダー)の設定¶
Console Appenderの設定です。ここでは最小限の設定を記述しています。
- log4j2.properties
appender.console.type = Console appender.console.name = CON appender.console.layout.type = PatternLayout appender.console.layout.pattern = %m%n
- ピリオドで区切られたキー名の最初のappenderは、コンポーネントの指定で既定のキーワードを記述
- ピリオドで区切られたキー名の2つ目のconsoleは、識別子の指定で任意の名称を記述(複数行の設定で一貫させる)
- ピリオドで区切られたキー名の3つ目以降はConsoleAppenderのパラメーター名
- typeはAppenderの種類で、ここではConsole Appender を指定
- nameはこのAppenderに付与する名前で後述のロガー設定等から参照するときに使われる
- layoutパラメーターにはさらにtypeとpatternのサブパラメータがあり、typeにはレイアウト種類、patternはレイアウト種類をPatternLayoutとしたときのパターン定義を記述(%mはメッセージ内容、%nは改行)
ルートロガーの設定¶
Log4j2には、ロガーの親としてルートロガーが存在します。
ルートロガーの出力レベルをinfo以上に、出力先(Appender)を先ほど定義したコンソール出力に設定します。
- log4j2.properties
rootLogger.level = info rootLogger.appenderRef.con.ref = CON
- キー名の最初のrootLoggerは、ルートロガーの既定のキーワード
- levelパラメータに、ルートロガーの出力レベルを指定
trace | debug | info | warn | error | fatal
- appenderRef で出力先の指定。conはrootLogger設定内での識別子で任意の名前を指定(consoleと合わせなくてもよい)、refは既定のキーワード、CONは先ほど定義したコンソール出力でnameパラメータに指定した名前と一致させる
ここまでの設定で、ルートロガーによりレベルinfo以上のログがコンソールに出力されるようになります。
簡単なサンプルプログラムと出力例¶
- HelloMain.java を表示
- log4j2.properties を表示
- コンソール出力
Info log Warn log Error log Fatal log
設定ファイルがない場合のデフォルトの出力¶
Log4j2では、設定ファイルが存在しない場合、デフォルトでルートロガーとコンソールアペンダーが設定されます。デフォルトの出力レベルはerrorで、コンソール出力の形式は
%d{HH:mm:ss:SSS} [%t] %-5level %logger{36} - %msg%n
となります。
- コンソール出力
08:11:23.626 [main] ERROR com.torutk.hello.HelloMain - Error log 08:11:23.630 [main] FATAL com.torutk.hello.HelloMain - Fatal log
ファイル出力(アペンダー)の設定¶
File Appenderの設定です。
log4j2.properties
appender.file.type = File appender.file.name = FILE appender.file.fileName = helloapp.log appender.file.layout.type = PatternLayout appender.file.layout.pattern = %d %-5p %c [%t] %m%n
- アペンダーの設定はピリオド区切りのキー名の最初にappenderを指定
- ピリオド区切りのキー名の2番目は、設定ファイル中でユニークな識別子を記述
- ピリオド区切りのキー名の3番目以降は File Appenderのパラメータ
- fileNameにはログを出力するファイルパスを記述。相対パス指定のときはプログラム実行時のカレントディレクトリを基点
- layoutについては先のConsole Appenderの時と同じくパターン定義を記述
%d
は年月日時分秒ミリ秒%-5p
はログレベルを左詰め5桁%c
はロガー名(典型的にはパッケージ名+クラス名)%t
はログを出力するスレッド%m%n
は先と同じ
ルートロガーにファイル出力を追加¶
ルートロガーに出力先(Appender)として先に定義したファイル出力を設定します。
log4j2.properties
rootLogger.level = info
rootLogger.appenderRef.con.ref = CON
+ rootLogger.appenderRef.file.ref = FILE
出力例¶
helloapp.log
2020-05-26 22:49:04,269 INFO com.torutk.hello.HelloMain [main] Info log 2020-05-26 22:49:04,273 WARN com.torutk.hello.HelloMain [main] Warn log 2020-05-26 22:49:04,274 ERROR com.torutk.hello.HelloMain [main] Error log 2020-05-26 22:49:04,274 FATAL com.torutk.hello.HelloMain [main] Fatal log
日時、レベル、ロガー名、スレッド名、メッセージがログファイルに出力されています。
パッケージ毎に出力レベルを指定¶
実践的なログでは、パッケージ毎に出力レベルを指定します。
設定例1¶
ルートロガー ---> アペンダー ↑ +----+----+ 子ロガー 子ロガー com.example.alfa com.example.bravo ↑ 子ロガー com.example.bravo.charlie
- ルートロガーにアペンダーを設定
- 子ロガーcom.example.alfa、com.example.bravo、com.example.bravo.charlieは、レベル設定のみ
すると、各ロガーは親ロガーにログを転送し、全ての親となるルートロガーにたどり着き、そこからアペンダーにログが出力されます。
- log4j2.properties
# appenderの設定(略) rootLogger.level = warn rootLogger.appenderRef.con.ref = CON rootLogger.appenderRef.file.ref = FILE logger.a.name = com.example.alfa logger.a.level = info logger.b.name = com.example.bravo logger.b.level = debug logger.bc.name = com.example.bravo.charlie logger.bc.level = trace
ロガーの親子関係は、loggerのnameパラメータに指定したパッケージ名の階層に基づき作られます。
設定例2¶
ルートロガー 子ロガー ーーーーーー+ com.example.alfa | | 子ロガー ーーーーーー+ーー→ アペンダー com.example.bravo | | 子ロガー ーーーーーー+ com.example.bravo.charlie
- 各ロガーにアペンダーを設定
- 各ロガーcom.example.alfa、com.example.bravo、com.example.bravo.charlieは、additivity=falseを指定し、親ロガーへの転送は行わない
- log4j2.properties
# appenderの設定(略) rootLogger.level = warn rootLogger.appenderRef.con.ref = CON rootLogger.appenderRef.file.ref = FILE logger.a.name = com.example.alfa logger.a.level = info logger.a.additivity = false logger.a.appenderRef.con.ref = CON logger.a.appenderRef.file.ref = FILE logger.b.name = com.example.bravo logger.b.level = debug logger.b.additivity = false logger.b.appenderRef.con.ref = CON logger.b.appenderRef.file.ref = FILE logger.bc.name = com.example.bravo.charlie logger.bc.level = trace logger.bc.additivity = false logger.bc.appenderRef.con.ref = CON logger.bc.appenderRef.file.ref = FILE
設定記述¶
PatternLayout¶
設定例(コンソール出力向け)¶
コンソール出力では、なるべく折り返しがないよう1行のログが短めになるよう設定します。
- 日時は、時間だけを出力
%d{HH:mm.ss.SSS}
- ログレベルを桁揃え(5桁左詰め)で出力
%-5p
- ロガー名(パッケージ名.クラス名)はパッケージ名の各階層を先頭1文字で、クラス名はすべてを出力
%c{1.}
- メッセージと改行
%m%n
appender.console.layout.pattern = %d{HH:mm:ss.SSS} %-5p %c{1.} - %m%n
設定例(ファイル出力向け)¶
外部定義の参照¶
システムプロパティの参照¶
ログファイルを、プログラムを実行するユーザーのホームディレクトリに生成する場合、ログファイルのファイル名設定にシステムプロパティを使いたくなります。
appender.file.fileName = ${sys:user.home}/hello.log
システムプロパティの参照は、${sys:システムプロパティ名}
となります。
環境変数の参照¶
ログファイルを既定のフォルダ等に生成する場合、ログファイルのファイル名設定に環境変数を使いたくなります。
appender.file.fileName = ${env:TEMP}/hello.log
環境変数の参照は、${env:環境変数名}
となります。
リソースバンドルの参照¶
T.B.D.