プロジェクト

全般

プロフィール

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/

使用方法

設定

設定ファイルまたはAPIでロギング設定を行います。
設定ファイルの形式には、JSON、YAML、プロパティ、XMLの4つの形式を使用可能です。

未設定時のデフォルト設定

  • コンソールに出力(ルートロガーにConsoleAppender)
  • ログ形式は"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"を指定したPatternLayoutをConsoleAppenderに設定
  • 出力レベルはERROR以上(ルートロガー)

設定ファイルの名前と配置

  1. システムプロパティlog4j.configurationFileで指定したパスを設定ファイルとして読み込む
  2. 上述が存在しない場合、クラスパス上にある規定の名前のファイルを以下順序で検索し、見付かった最初のファイルを読み込む
    • log4j2-test.properties
    • log4j2-test.yaml または log4j2-test.yml
    • log4j2-test.json または log4j2-test.jsn
    • log4j2-test.xml
  3. 上述が存在しない場合、クラスパス上にある規定の名前のファイルを以下順序で検索し、見付かった最初のファイルを読み込む
    • log4j2.properties
    • log4j2.yaml または log4j2.yml
    • log4j2.json または log4j2.jsn
    • log4j2.xml

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