Log4J2の仕組み:それを最大限に活用するための10の方法
Log4J2は、Javaエコ バージョン2.xは、その前身のすべてのロギング機能を保持し、特にパフォーマンスの分野で、いくつかの重要な改善とその基盤の上に構築されます。
そしてもちろん、監査とデバッグの両方の目的で、どのアプリケーションにとってもインストルメンタルなロギングがどのようにあるかを考えると、solid loggingライブラリを選択することは非常に重要な決定です。次のセクションでは、log4j2ライブラリがその決定に最適な理由と、アプリケーションでどのように使用できるかを見ていきます。プロジェクトでlog4j2の使用を開始するには、単にlog4j-core依存関係を追加する必要があります。 Mavenを使用している場合は、pomに次の依存関係を追加できます。xmlファイル:また、Gradleを使用している場合は、ビルドに依存関係を追加する必要があります。gradle file:
dependencies { compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.8.2'}
自分で明示的に定義しないと、log4j2は自動的に簡単な設定を提供します。 デフォルトの設定は、エラーレベル以上のレベルでコンソールにログを記録します。
この基本設定を使用してメッセージのログを開始するには、LogManagerクラスを使用してLoggerインスタンスを取得するだけです:
private static Logger logger = LogManager.getLogger(MyService.class);
次に、loggerオブジェクトを必要なログレベルに対応するメソッドで使用できます。
logger.error("This is an error message");
Log4J2設定のカスタマイズ
カスタムlog4j2設定は、プログラムまたは設定ファイルを介して作成することができます。ライブラリは、XML、JSON、YAMLで書かれた設定ファイルだけでなく、をサポートしています。プロパティ形式。 ここでは、主にすべての例を説明するためにXMLを使用します。最初に、log4j2を作成するだけで、デフォルトの設定を上書きできます。クラスパス上のxmlファイル:
この単純な設定で使用されるタグを詳しく見てみましょう。
- Configuration:log4j2設定ファイルのルート要素;status属性は内部log4jイベントがログに記録されるレベルを表します
- Appenders:この要素にはappendersのリストが含まれています。この例では、システムコンソールに対応するappenderが定義されています
- Loggers:この要素にはLoggerインスタンスのリストが含まれています。 ルート要素はすべてのメッセージを出力する標準ロガーです
ルートロガーはすべての設定で必須であることを理解することが重要です。 説明したように、提供しない場合は、デフォルトでコンソールアペンダーとエラーログレベルで自動的に構成されます。
アペンダーの設定
log4j2アーキテクチャでは、アペンダーは基本的に特定の出力先にログメッセージを送信する責任があります。ライブラリが提供する最も便利なタイプのアペンダを以下に示します。
:
- ConsoleAppender–メッセージをシステムコンソールに記録する
- FileAppender–ログメッセージをファイルに書き込む
- RollingFileAppender–メッセージをローリングログファイルに書き込む
- JDBCAppender–ログ用アペンダーがどのように機能するかを理解し、いくつかの設定例を見てみましょう。
RollingFileAppender
すべてを1つのファイルに記録することは、もちろん理想的ではありません。 通常、アクティブなログファイルを定期的にロールオーバーする方がはるかに優れています–これはまさにRollingFileAppenderが行うことです。
また、このタイプのアペンダーで基本を超えて、カスタムトリガポリシーとロールオーバー戦略の両方を設定することもできます。
トリガーポリシーは、ログファイルがロールされるタイミング、つまり新しいファイルが作成されるタイミングを決定し、ロールオーバー戦略はファイルのロール
簡単な例として、3つのポリシーに基づいて新しいログファイルを作成するアペンダーを設定しましょう。
- OnStartupTriggeringPolicy–JVMが起動するたびに新しいログファイ>
設定では、defaultrolloverstrategyが使用されます:
このスタイルの設定がどれほど柔軟であるか、ロギング戦略の正確なセマンティクスを最後の詳細まで調整する方法を見ることができます。
JDBCAppender
名前が示すように、このアペンダーはJDBCを使用してリレーショナルデータベースにログを書き込みます。この構成では、JndiデータソースまたはカスタムConnectionFactoryのいずれかになるConnectionSourceを定義する必要があります。 ロガーはConnectionSourceを使用してJDBC接続を取得するため、パフォーマンスを向上させるために接続プールを使用することが重要です。ご覧のように、Jndiデータソースは単にDataSourceタグのjndiName属性を使用して指定されています。
XML構成ファイルでアペンダーを構成するには、JDBCタグを使用します。
ConnectionSourceとともに、ログデータの格納に使用するテーブルと列を定義できます。
The FailoverAppender
最後に、FailoverAppenderを見てみましょう;これは、プライマリアペンダーと、プライマリアペンダーが失敗した場合にログを処理するためにステップイン
たとえば、データベース接続が確立できない場合に備えて、プライマリJDBCAppenderをセカンダリのRollingFileとコンソールアペンダーで構成できます。
実稼働環境では、ログメカニ
レイアウトの設定
アペンダーは宛先にログメッセージを送信する責任がありますが、レイアウトはアペンダーによってログメッセージのフォー
以下は、log4j2が提供するより一般的に使用されるレイアウトのいくつかの簡単な説明です:
- PatternLayout–文字列パターンに従ってメッセージを設定します
- JsonLayout–ログメッセージのJSON形式を定義します
- CsvLayout–CSV形式でメッセージを作成するために使用できます
PatternLayout
これは非常に柔軟な解決策であり、ログメッセージの最終出力を多く制御できます。
このメカニズムは、主に変換指定子を含む変換パターンによって駆動されます。 各指定子は%記号で始まり、メッセージの幅や色などを制御する修飾子と、日付やスレッド名などのコンテンツを表す変換文字が続きます。
日付、スレッド、ログレベル、ログメッセージを異なる色で表示するようにログ行を設定するPatternLayoutの設定例を見てみましょう。
これらの指定子は詳細に理解する価値があるので、詳しく見てみましょう。
- %d{HH:mm:ss。SSS}–指定された形式でログイベントの日付を出力します
- %t–スレッド名を出力します
- %level–メッセージのログレベルを表示します
- %highlight{%level}–中括弧の間のパターンの色を定義するために使用されます
- %msg%n–ログメッセージを出力します
出力は、異なる色でログレベルを表示します。
出力は、異なる色でログレベルを表示します。
パターンを定義するためのオプションは、patternlayoutのlog4j2ドキュメントにあります。
JSON形式を使用したJsonLayout
データのロギングには、ログツールを使用してログを分析および処理しやすくするなど、いくつかの重要な利点があります。
Log4j2でJSONLayoutを設定するには、対応するタグを定義するだけです。
<JSONLayout complete="true" compact="false"/>
complete=trueを設定すると、整形式のJSONドキュメントが生成されます。
JSONを生成できるようにするには、jackson-databindライブラリをクラスパスに追加する必要があります:
フィルタの設定
log4j2のフィルタは、ログメッセージを処理するかスキップするかを決定するために使用されます。
フィルタは、設定全体に対して、またはロガーまたはアペンダーレベルで設定できます。
ライブラリには、使用できるいくつかのタイプのフィルタが用意されています:
- BurstFilter–許可されるログイベントの数を制御します
- DynamicThresholdFilter–特定の属性に基づいてログ行をフィルタリングします
- RegexFilter–正規表現に一致するかどうかに基づそのためには、BurstFilterを設定し、それをINFOメッセージに適用することができます。
:
<Filters> <BurstFilter level="INFO" rate="10" maxBurst="100"/></Filters>
これは、情報レベルのメッセージのトラフィックを選択的に無視し、情報の上にあるより重要なメッセージを失わないようにします。
この場合、rateは毎秒処理される平均ログメッセージを定義し、maxBurstはフィルタがログエントリの削除を開始する前にトラフィックバーストの全体的なサ
同様に、特定の正規表現に一致するログメッセージのみを受け入れるようにアペンダーを設定できます:
<Appenders> <JDBC name="JDBCAppender"> <RegexFilter regex="*jdbc*" onMatch="ACCEPT" onMismatch="DENY"/> </JDBC></Appenders>
全体的に、このフィルタリングメカニズムは、全体的なロギング設定の各アペンダーが適切な情報を追跡していることを確認するた 非常に具体的で関連性の高い情報のみをログに記録する機能は、一般的に、特に複雑なシステムでは、特に強力なログ表示ツールと組み合わせると、非常に迅速な根本原因分析につながります。
ロガーの設定
ルートロガーのほかに、異なるログレベル、アペンダ、またはフィルタを持つ追加のロガー要素を定義することもできます。 各ロガーには、後で参照するために使用できる名前が必要です。
<Loggers> <Logger name="RollingFileLogger"> <AppenderRef ref="RollingFileAppender" /> </Logger></Loggers>
この特定のロガーを使用してログメッセージを書き込むには、LogManagerクラスを使用して参照を取得できます。
Logger rfLogger = LogManager.getLogger("RollingFileLogger");rfLogger.info("User info updated");
これらのロガーの階層を構造化するもう一つの非常に一般的な方法は、Javaクラスに基づいています。
Logger logger = LogManager.getLogger(MyServiceTest.class);
ルックアップの使用
ルックアップは、log4j2構成に外部値を挿入する方法を表します。 Rollingfileappender設定で日付検索の例をすでに見てきました:
<RollingFile name="RollingFileAppender" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
preceding{date:yyy-MM}ルックアップは、ファイル名に現在の日付を挿入し、前の$はエスケープ文字であり、ルックアップ式をfilePattern属性に挿入します。
format{sys:property_name}:
<File name="ApplicationLog" fileName="${sys:path}/app.log"/>
検索して挿入できる別のタイプの情報は、Java環境情報です。
<PatternLayout header="${java:version} - ${java:os}"> <Pattern>%d %m%n</Pattern></PatternLayout>
検索を通じて挿入できるデータの種類の詳細は、log4j2のドキュメントにあります。
プログラムによる構成
構成ファイルのほかに、log4j2をプログラムで構成することもできます。 これにはいくつかの方法があります。
- カスタムConfigurationFactoryを作成する
- Configuratorクラスを使用する
- 初期化後の設定を変更する
- プロパティファイルとプログ:
次に、通常どおりロガーの使用を開始できます。
Logger pLogger = LogManager.getLogger("programmaticLogger");pLogger.info("Programmatic Logger Message");
このスタイルのfluent APIは、Javaコードを直接操作する利点の恩恵を受けているため、より複雑なロ
しかし、XMLはまだ読みやすくコンパクトであることを考えると、多くの場合、プログラムで構成を開発し、すべてが完了したときにXMLに変換するこ
カスタムログレベル
log4j2の組み込みログレベルは次のとおりです:
- OFF
- FATAL
- ERROR
- WARN
- INFO
- DEBUG
- TRACE
- ALL
これらに加えて、アプリケーションのニーズに応じてカスタムログレベルを定義することもできます。たとえば、この新しいログレベルを定義するには、そのレベルを使用できます。forName()API–新しいレベル名と、ログ-レベル階層内のレベルの場所を表す整数を指定します:
Level myLevel = Level.forName("NEW_LEVEL", 350);
使用する整数値を決定するには、log4j2ドキュメントの他のログレベルに定義されている値を見ることができます。
350値はWARNとINFOの間にレベルを置きます。カスタムレベルでメッセージをログに記録するには、log()メソッドを使用する必要があります。
logger.log(myLevel, "Custom Level Message");
同等のXML設定は次のようになります。
<CustomLevels> <CustomLevel name="NEW_XML_LEVEL" intLevel="350" /></CustomLevels>
標準のログAPIを介して使用できます:新しいカスタムレベルは、標準レベルと同じ方法で表示されます。
11:28:23.558 NEW_LEVEL - Custom Level Message11:28:23.559 NEW_XML_LEVEL - Custom XML Level Message
Log4J1からの移行。x
1を使用してアプリケーションを移行する場合。xバージョンのライブラリを現在の2.xバージョンでは、あなたが従うことができるルートのカップルがあります:
- log4jを使用します1。xブリッジ
- 手動でAPIと設定を更新
ブリッジを使用するのは簡単です。 Log4j依存関係をlog4j-1.2-apiライブラリに置き換えるだけで済みます:
これはより高速な方法ですが、変換できる構成のタイプが制限されるという欠点があります。
手動の方法は、もちろん、より多くの作業ですが、最終的には、より柔軟で強力なログソリューションにつながります。
以下に、最も一般的な変更の種類をいくつか示します。
結論
ログファイルはどの本番環境でも重要であり、優れたログソリューションを選択することは、本番環境の問題を理解するために5分を費やすことと一日を費やすことの違いになる可能性があります。
Log4J2は、幅広い構成オプションを備えた、最新のJavaアプリケーション用の強力で堅牢なロギングソリューションです。
ローリングファイル、さまざまなタイプのログ出力先、JSONやXMLなどの構造化されたログ形式のサポート、複数のロガーとフィルタ、カスタムログレベルなどの高度なログ記録のベストプラクティスを簡単に設定できます。最後に、ログデータを手動で分析するだけでなく、Retrace APMに含まれているロギング機能を確認してください。
- OnStartupTriggeringPolicy–JVMが起動するたびに新しいログファイ>
Leave a Reply