Javaロギング フレームワークは、Java プラットフォーム用のコンピュータ データ ロギングパッケージです。この記事では、汎用ロギング フレームワークについて説明します。
ロギングとは、アプリケーションによるアクティビティの記録を指し、開発チームにとって一般的な問題です。ロギング フレームワークは、Java プラットフォームのロギング プロセスを容易にし、標準化します。特に、コンソールへの明示的な出力を回避することで柔軟性を提供します (以下の Appender を参照)。ログが書き込まれる場所はコードから独立し、実行時にカスタマイズできます。
残念ながら、JDKの最初のリリースにはログ記録が含まれていなかったため、Java Logging API が追加される頃には、Apache Commons Logging (Java Commons Logging または JCL とも呼ばれる) やLog4jなど、他のいくつかのログ記録フレームワークが広く使用されるようになりました。これにより、それぞれ異なるログ記録フレームワークを使用するさまざまなサードパーティ ライブラリ (JAR) を統合するときに問題が発生しました。この問題を解決するために、プラグ可能なログ記録フレームワーク (ラッパー) が開発されました。
機能の概要
ログ記録は通常、ロガー、フォーマッタ、アペンダー (またはハンドラ) の 3 つの主要な部分に分かれています。
- Logger は、ログに記録するメッセージを特定のメタデータとともにキャプチャし、それをログ フレームワークに渡す役割を担います。
- メッセージを受信した後、フレームワークはメッセージとともにフォーマッタを呼び出し、出力用にフォーマットします。
- 次に、フレームワークはフォーマットされたメッセージを適切なアペンダー/ハンドラーに渡して処理します。これには、コンソール ディスプレイへの出力、ディスクへの書き込み、データベースへの追加、電子メールの生成などが含まれます。
Object Guy の Logging Framework [ permanent dead link ]のような、よりシンプルなログ記録フレームワークでは、ロガーとアペンダーが組み合わされています。これにより、デフォルトの操作が簡素化されますが、特にプロジェクトが複数の環境間で移動される場合、構成が難しくなります。
ロガー
Logger は、出力がどこに送信/保存されるかに関係なく、アプリケーションがログを記録できるようにするオブジェクトです。アプリケーションは、指定された名前/識別子のロガー オブジェクトにオブジェクトまたはオブジェクトとオプションの重大度レベルの 例外を渡すことによって、メッセージをログに記録します。
名前
ロガーには名前があります。名前は通常、階層構造になっており、レベルはピリオド (.) で区切られます。一般的なスキームは、ロギングを実行するクラスまたはパッケージの名前を使用することです。Log4j と Java ロギングAPI はどちらも、階層の上位にあるハンドラーの定義をサポートしています。
たとえば、ロガーの名前は「com.sun.some.UsefulClass」になります。ハンドラーは次のいずれかに対して定義できます。
comcom.suncom.sun.somecom.sun.some.UsefulClass
このスタックのどこかにハンドラーが定義されている限り、ログ記録が行われる可能性があります。たとえば、com.sun.some.UsefulClassロガーに記録されたメッセージは、com.sunハンドラーによって書き込まれる可能性があります。通常、任意のロガーによって生成されたメッセージを受信して処理するグローバル ハンドラーが存在します。
重大度レベル
メッセージは特定のレベルでログに記録されます。一般的なレベル名は Apache Commons Logging からコピーされます (ただし、Java Logging API では異なるレベル名が定義されています)。
ログ フレームワークは、各ロガーの現在のログ レベルを維持します。ログ レベルは、より厳しく、またはより緩く設定できます。たとえば、ログ レベルが「WARNING」に設定されている場合、そのレベル以上のすべてのメッセージ (ERROR および FATAL) がログに記録されます。
重大度レベルは、ロガーとアペンダーの両方に割り当てることができます。出力を生成するには、特定の重大度レベルに対して両方を有効にする必要があります。そのため、デバッグ出力が有効になっているロガーは、メッセージを取得するハンドラーもデバッグが有効になっていない場合、出力を生成しません。
フィルター
フィルターにより、ログ イベントが無視されるか、ログに記録されます。最もよく使用されるフィルターは、前のセクションで説明したログ レベルです。Log4j 2 や SLF4J などのログ フレームワークではマーカーも提供されており、これをログ イベントに添付すると、フィルター処理にも使用できます。フィルターを使用すると、スローされる例外、ログ メッセージ内のデータ、ログ API を通じて公開される ThreadLocal のデータ、その他のさまざまな方法に基づいて、ログ イベントを受け入れたり拒否したりすることもできます。
フォーマッタ、レイアウト、レンダラー
フォーマッタは、特定のオブジェクトをフォーマットするオブジェクトです。主に、バイナリ オブジェクトを取得して文字列表現に変換します。各フレームワークでは、必要に応じてオーバーライドできるデフォルトの出力形式が定義されています。
アペンダーまたはハンドラー
アペンダーは、指定された最小重大度レベル以上のメッセージをリッスンします。アペンダーは渡されたメッセージを受け取り、適切に投稿します。メッセージの処理には次のものがあります。
- コンソールに表示する
- ファイルまたはsyslogに書き込む
- データベーステーブルに追加する
- Java メッセージング サービス経由で配布する
- メールで送信
- ソケットに書き込む
- 「ビットバケット」(/dev/null)に破棄する
機能比較
考慮事項
JCL と Log4j は、長い間使用され、長い間唯一の選択肢であったため、非常に一般的です。slf4j (下で Logback を使用) の柔軟性により、slf4j は人気のある選択肢となっています。
SLF4J は、他のフレームワークを模倣できるロギング ラッパー (またはシム) のセットです。したがって、各ライブラリが使用するロギング フレームワークに関係なく、複数のサードパーティ ライブラリをアプリケーションに組み込むことができます。ただし、すべてのロギング出力は、通常は Logback を介して標準的な方法で生成されます。
Log4j 2 は API と実装の両方を提供します。API は、SLF4J の動作と同等の他のログ実装にルーティングできます。SLF4J とは異なり、Log4j 2 API は柔軟性を高めるために文字列ではなくメッセージ[2]オブジェクトをログに記録し、Java ラムダ式もサポートします。[3]
JCL は実際にはロギング フレームワークではなく、ロギング フレームワークのラッパーです。そのため、JCL の下位にはロギング フレームワークが必要ですが、デフォルトで独自のSimpleLogロガーを使用することもできます。
JCL、SLF4J、Log4j 2 API は、アプリケーションで使用されている基盤となるロギング システムに書き込む必要がある再利用可能なライブラリを開発するときに便利です。また、ロギング フレームワークが変更される可能性のある異機種環境でも柔軟性が得られますが、ほとんどの場合、ロギング フレームワークを一度選択すると、プロジェクトの存続期間中にそれを変更する必要はほとんどありません。SLF4J と Log4j 2 は新しいという利点があり、古いフレームワークから学んだ教訓を基に構築されています。さらに、JCL は、どのロギング ライブラリをラップするかを決定する際にクラス ローダーで既知の問題を抱えていました[4] 。これは現在 JCL に取って代わっています。[5]
Java Logging API は Java で提供されています。この API は技術的には Java で提供されるデフォルトの実装とは別ですが、代替実装に置き換えることは難しいため、多くの開発者がこの実装を Java Logging API と混同しています。設定は外部ファイルのみで行われ、オンザフライで簡単に変更することはできません (他のフレームワークはプログラムによる設定をサポートしています)。デフォルトの実装では、いくつかのハンドラとフォーマッタしか提供されていないため、ほとんどのユーザーは独自のものを作成する必要があります。[6]
参照
- SLF4J
- ログ4j
- ログバック
- コンテキスト プログラミングに基づくJavalution LogContext (実行時に選択可能な実際のログ記録フレームワーク)。
- ランタイムインテリジェンス
参考文献
- ^ 「tinylog のユーザーマニュアル」。2013年4月15日時点のオリジナルよりアーカイブ。
- ^ Log4j2 API メッセージ
- ^ Java 8 Lambda による遅延ログのサポート
- ^ コモンズのログ記録の回避
- ^ Spring ロギングの概要
- ^ java.util.logging の概要
外部リンク
- Java 6.0 ロギング API
- コモンズログ
- プロトマター
- Java のオープンソース ロギング ツール
- Apache 2.0 ライセンス。
- Logback - 人気のLog4jプロジェクトの後継
- tinylog - 静的ロガーを備えた最小限のログユーティリティ
- Loggifier .class、.jar、.ear ファイルにログ コードを挿入するツール
- JLV - 現在Eclipse IDEのプラグインとして利用可能なJavaログビューア
- パフォーマンス
- SLF4J
- ログ4j2
