Java Logging with SLF4J and Log4j 2

最終更新: 2025-08-15 19:45:52 +0800 +0800
tags: Java | Log4j2 | Logging | Slf4j
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

SLF4J はロギング API ファサードです。アプリケーションコードは slf4j-api に依存し、 デプロイ時に Log4j 2 や Logback など互換性のあるプロバイダーを 1 つ選択します。 SLF4J 2 は ServiceLoader でプロバイダーを検出するため、1 つだけ保持します。 Log4j 2 では log4j-slf4j2-impl が SLF4J を Log4j Core に適合させます。 log4j-to-slf4j と組み合わせてはいけません。イベントがファサードへ再入し、 ブリッジループを形成するためです。

java
private static final Logger log = LoggerFactory.getLogger(Orders.class);
log.info("Accepted order {}", orderId);
log.warn("Order {} failed validation", orderId, exception);

パラメーター化されたメッセージは、レベルが無効な間のフォーマット処理を遅延させます。 スタックトレースをテキストへ埋め込むのではなく、明示的な例外引数を使用します。

階層と設定 #

ロガー名はドット区切りの階層を形成します。子に設定レベルがない場合は、最も近い 設定済みのレベルを継承します。Log4j 2 の一般的な順序付きレベルは TRACE、 DEBUG、INFO、WARN、ERROR、FATAL です。Log4j 2 は一致する LoggerConfig を通じてイベントをルーティングし、デフォルトでは祖先のアペンダーにも渡します。 専用アペンダーから親アペンダーへも渡してはならない場合にだけ additivity="false" を設定してください。そうしないとイベントが重複します。

アペンダーは宛先であり、レイアウトはイベントをシリアライズします。Log4j Core は コンソール、ローリングファイル、ソケットなどのアペンダーと、パターンおよび JSON レイアウトを提供します。プラグインシステムは @Plugin 拡張型を検出し、設定要素を 対応する実装へ対応付けます。設定検出は明示的な log4j2.configurationFile を優先し、 次にクラスパスの規約を使用します。パッケージングが曖昧になり得る場合は、本番用の 場所を明示してください。

Log4j 2 は monitorInterval を使ってローカル設定を監視できます。再読み込みは稼働中 システムを変更するため、デプロイ時に設定を検証し、再読み込みによって一時的に安全 でないレベル、宛先、認証情報が選択されないようにします。

運用データ #

相関 ID と安定したリクエストメタデータを SLF4J MDC/Log4j Thread Context に配置し、 finally ブロックとエグゼキューターラッパーでコンテキストを消去してリクエスト間の 漏洩を防ぎます。バックエンドでインデックス化できる場合は構造化フィールドを優先 します。パスワード、トークン、セッション識別子、秘密鍵、未編集の個人データは決して ログに記録せず、ログイベントを構築する前にマスキングします。ロギング設定は実行可能な 運用ポリシーであるため、設定の書き込みとプラグインのロードを制限します。

References #

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)