web-dev-qa-db-ja.com

Javaでのロギングの概要

他のパッケージではなく、次のパッケージのいずれかを使用するのはなぜですか?

  • Javaロギング
  • コモンズロギング
  • Log4j
  • SLF4j
  • ログバック
117
Loki

(私の知る限り)api出現の時系列順:

  • ほとんどの人が(私の経験では)Log4jを使用しているため
  • Commons Loggingは、オープンソースプロジェクトで使用されているためです(統合ソリューションで使用されているロギングフレームワークと統合できるため)。 API /フレームワーク/ OSSで、Commons Loggingを使用する他のパッケージに依存している場合に特に有効です。
  • Commons Loggingは、特定のロギングフレームワークに「ロックダウン」したくないため(代わりに、Commons Loggingが提供するものにロックダウンしたいため)、この点を理由として使用するのは賢明ではないと思います。
  • 追加のjarを追加したくないため、Javaロギング。
  • Commons Loggingよりも新しく、パラメーター化されたロギングを提供するSLF4j:

logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
    // Note that it's actually *more* efficient than this - see Huxi's comment below...
    logger.debug("The entry is " + entry + "."); 
}
  • Logbackは、log4jよりも新しいため、SLF4jを直接実装するため、パラメーター化されたロギングをサポートします。
  • SLF4j/Logbackは、log4jを実行したのと同じ人が書いたため、改善されました( によると、Ken G -ありがとう。 以前のニュース投稿を見る
  • SLF4jは、log4jアダプターも公開しているため、古いコードでlog4jを「スイッチアウト」する必要がないため、log4j.propertiesでSLF4jを使用し、その設定を行うだけです。
86
Stephen

Java=でのロギングは、混乱し、一貫性がなく、文書化が不十分で、特に無計画であることがわかります。さらに、これらのロギングフレームワークには非常に多くの類似点があり、結果として作業の重複と混乱が生じます。実際にどのロギング環境にいるか。特に、深刻なJava Webアプリケーションスタックで作業している場合、一度にmultipleロギング環境にいることがよくあります。 (例えば、hibernateはlog4jとTomcat Java.util.loggingを使用する場合があります。)Apache commonsは異なるロギングフレームワークをブリッジすることを意図していますが、実際にはより複雑になります。これを事前に知らない場合、それは完全に戸惑います。ログメッセージがコンソールなどに出力されないのですか?ああ、log4jではなく、Tomcatのログを見ているためです。さらに複雑なレイヤーを追加すると、アプリケーションサーバーは、特定のWebアプリケーション。最後に、これらすべてのロギングf rameworksは複雑すぎます。ログインJavaは、私のような開発者を苛立たせ混乱させている混乱した混乱です。

Javaの初期バージョンには、このシナリオにつながる組み込みのロギングフレームワークがありませんでした。

36
Julien Chastang

これまでに触れられていない重要な点が1つあります。

SLF4J(およびロギングバックエンドとしてのLogbackとLOG4Jの両方)は、いわゆるマップされた診断コンテキスト(MDC、 javadoc および documentation を参照)をサポートしています。

これは基本的にスレッドローカルなMap <String、String>であり、ロギングイベントに追加のコンテキスト情報を追加するために使用できます。 MDCの現在の状態は、すべてのイベントに関連付けられています。

ユーザー名やリクエストのURL(ウェブアプリの場合)のようなものをそれに入れると、これは非常に便利です。これは、たとえばフィルターを使用して自動的に行うことができます。

22
Huxi

質問への回答も参照してください エラーをログに記録するためのベストプラクティスは何ですか? 、特に:

  • Commons Loggingには、潜在的なクラスローディングの問題があります。

  • Log4JとSLF4Jは同じ人物によって開発され、Log4Jで実際に見つかった問題から学びました。

17
Ken Gentle

Commons Loggingの概要 は、その存在の理由を示します。基盤となるロギングフレームワークを制御できない場合のライブラリコードからのロギング。外部アプリケーションにリンクされるさまざまなApacheプロジェクトにとって非常に重要です。完全に制御できる内部ITプロジェクトではおそらくそれほど重要ではありません。

そうは言っても、私が知っている他の多くの開発者がそうであるように、私はCommons Loggingに書き込みます。その理由は、精神的な荷物を最小限に抑えるためです。プロジェクトまたはジョブを変更でき、新しいフレームワークを学習する必要はありません(新しいジョブ/プロジェクトもCLを使用している、および/またはそれらに移動するように説得できる)。

また、使用するフレームワークの周りに独自のラッパーを作成することにも価値があります。 ここ で説明したように、LogWrapperオブジェクトを使用してカスタムの文字列化(重要)を提供し、ロギングステートメントの視覚的な混乱を最小限に抑えたい(それほど重要ではない)。

4
kdgregory

弊社のプロジェクトではLOG4jを使用しており、Stephenが彼の例で示したように非常に簡単に使用できます。また、独自の出力ファイルスキーマを作成できるように、LOG4j用の独自のパターンクラスも作成しました。ログファイルがどのように見えるかを説明できます。オリジナルのlog4jクラスを拡張することが可能です。

Log4j.propertiesファイルで変更できるすべてのLOG4jプロパティ。これにより、プロジェクトごとに異なるファイルを使用できます。

Javaロギングは私の好みではありませんが、最初からlog4jを使用していることが原因である可能性があります。

4
Markus Lausberg

通常、私はデフォルトでLog4Jを使用します。

Java 1.4への依存を気にしない場合は、Java Loggingを使用しますが、Log4Jを優先して使用します。

Commons Loggingをすでに使用しているものを拡張する場合は、それを使用します。

2

ロギングフレームワークのいずれかに書き込むことができるシンロギングファサードを作成することをお勧めします。その時点で、バッキングエンジンの選択はほとんど問題になります。

0
tsimon