Log4j2¶
- 目次
- Log4j2
概要¶
log4j 2は、かつて存在した log4j (バージョン1系)の後継ライブラリとして再設計されたロギングライブラリで、Apacheプロジェクトの一つとして開発されています。
https://logging.apache.org/log4j/2.x/
Java SE標準のロギングAPIに比べて、高機能、高性能となっており、外部ライブラリの管理とのトレードオフで選択することがあります。
入手¶
公式サイトから[Download]を辿って、バイナリアーカイブを入手します。
バイナリアーカイブには多数のJARファイルが含まれていますが、基本機能は次の2つのJARファイルを使用します。
- log4j-api
log4j 2を利用するアプリケーションに提供するAPIを収めたライブラリ(JAR)ファイル - log4j-core
APIの実装を収めたライブラリ(JAR)ファイル。この他に、利用する機能によってはさらに別なライブラリを必要とする
Asynchronouse Loggerを使う場合¶
Asynchronous Loggerを使う場合は、log4j 2とは別にLMAX Disrupterライブラリを必要とします。
https://lmax-exchange.github.io/disruptor/
使用方法¶
ライブラリ参照¶
- コンパイル時にlog4j-apiを指定
- 実行時にlog4j-apiおよびlog4j-coreを指定
Gradleビルド定義の記述¶
dependencies {
runtimeOnly 'org.apache.logging.log4j:log4j-core:2.13.3'
implementation 'org.apache.logging.log4j:log4j-api:2.13.3'
}
ログ設定¶
設定ファイルまたはAPIでロギング設定を行います。
設定ファイルの形式には、JSON、YAML、プロパティ、XMLの4つの形式を使用可能です。
未設定時のデフォルト設定¶
- コンソールに出力(ルートロガーにConsoleAppender)
- ログ形式は
"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"
を指定したPatternLayoutをConsoleAppenderに設定 - 出力レベルはERROR以上(ルートロガー)
設定ファイルの名前と配置¶
- システムプロパティ
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
アプリケーションプログラムでの利用方法の一例¶
- アプリケーション利用者がログ設定をする際は、コマンドラインオプション(JVMオプション)でシステムプロパティ
log4j.configurationFile
にログ設定ファイル名(パス)を指定 - アプリケーション利用者がログ設定をしなかった場合に備えて、クラスパス上に既定の名前のファイルを予め仕込んでおく
Appenderの種類(抜粋)¶
ConsoleAppender CassandraAppender FlumeAppender FailoverAppender FileAppender JDBCAppender JMSAppender RewriteAppender RollingFileAppender JPAAppender HttpAppender RoutingAppender AsyncAppender NoSQLAppender KafkaAppender MemoryMappedFileAppender SMTPAppender RandomAccessFileAppender SocketAppender RollingRandomAccessFileAppender SyslogAppender OutputStreamAppender ZeroMQ Appender
設定ファイルの書き方¶
ロガー¶
パッケージ階層とクラス名に基づくロガーの使用¶
設定ファイルの書き方メモ¶
プロパティファイル形式¶
log4j 2.4から追加されたプロパティファイル形式の設定ファイル。
log4j 2.6からはアペンダー、フィルター、ロガーの識別子をカンマ区切りで列挙する必要なし。
キー名 | 指定例 | 内容 |
---|---|---|
status | status = warn | log4jの内部ログの出力レベルを指定。通常(デフォルト)はoff |
dest | dest = err | log4jの内部ログの出力先。out、err、ファイルパス、URLを指定可 |
name | name = PropertiesConfig | 設定名 |
- ルートロガーは必ず設定する
設定をしなかった場合は、ERRORレベルを出力し、ConsoleAppenderを接続したルートロガーが設けられる - ルートロガーは名前属性をもたない
パフォーマンス考慮¶
マルチスレッドアプリケーション¶
- デフォルトで有効になっている log4j.enableDirectEncoders は共有するバッファをスレッド間で排他使用するのでマルチスレッド下で性能劣化が生じる。Async Loggerを検討すべし。
ガベージしにくい設定(garbage-free logging)¶
- log4j2.enableThreadlocals を有効にする(非Webアプリケーションではデフォルト有効)
- log4j2.garbagefreeThreadContextMapを有効にする
- 次のアペンダーはgarbage-freeに対応
Console、File、RollingFile、RandomAccessFile、RollingRandomAccessFile、MemoryMappedFile - 次のフィルターはgarbage-freeに対応
CompositeFilter、DynamicThresholdFilter、LevelRangeFilter、MapFilter、MarkerFilter、StructuredDataFilter、ThreadContextMapFilter、ThresholdFilter、TimeFilter