プロジェクト

全般

プロフィール

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

Log4j 2のマニュアル 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.