Javaのロギングはどうなっていますか?[閉まっている]


117

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

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

4
SLF4jをCommons Loggingと比較するstackoverflow.com/questions/873051が必要になる場合があります。
ジェームズマクマホン

24
Cekiが3つのロギングフレームワークを作成した理由!!! その狂気...
mP。

6
@mP。-最初にlog4jがあり、それから不一致が発生し、slf4j + logbackが書き込まれました。slf4jはAPIであり、APIの実装をログバックします。他のすべてに関係なく、slf4jは非常に便利です。
–ThorbjørnRavn Andersen 2012

3
CekiGülcüがSLF4J + Logbackを作成した理由の詳細については、次のDevoxx講演を参照してください。parleys.com
#st =

これから出てくる最善のことはslf4j APIであり、ロギングの世界を統一できると期待しています。logbackはまだ開発者とのクリティカルマスを達成していないと思います。
するThorbjörnRavnアンデルセン

回答:


86

(私の知る限り)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を使用し、その設定を行うだけです。

3
コモンズロギングの背後にある考えを私が知ることができる限り、それはライブラリで使用されるべきであるということです。このようにして、ライブラリは、ホスティングアプリケーションが使用するのと同じロギングフレームワークを(コモンズロギングを介して)常に使用できます。
Joachim Sauer

質問してくれたLokiに感謝します。これで、log4jをデフォルトのフレームワークとして使用しなくなることがわかりました。SLF4j FTW!また、SLF4jはlog4jと同じ人によって作成されたことを指摘してくれたKen Gにも感謝します
Stephen

3
コード例のコメントは100%正しくありません。メッセージの実際のフォーマットはLogbackによって遅延実行されるため、イベントが実際にアペンダーによって処理され、アペンダーがフォーマットされたメッセージを必要する場合にのみ発生します。たとえば、SocketAppenderの場合は発生しません。変更されていないメッセージパターン+文字列としての引数。それはあなたがどのように「効果的に」定義するかにかかっていると思います。それは確かに同じメッセージを出力します(少なくともエントリとオブジェクトが同じである場合は;))。
Huxi

6
SLF4Jは実際には、他のロギングフレームワークの上に位置する単なるAPIです。Commons Loggingの目標に似ていますが、私の経験からより直感的です。
James McMahon、

37

Javaでのログインは、混乱し、一貫性がなく、文書化が不十分で、特に無計画であることがわかりました。さらに、これらのロギングフレームワークには非常に多くの類似点があり、結果として作業が重複し、実際にどのロギング環境にいるかについて混乱が生じます。特に、深刻なJava Webアプリケーションスタックで作業している場合は、複数一度にロギング環境。(たとえば、hibernateはlog4jとtomcat java.util.loggingを使用する場合があります)。Apacheコモンズは、異なるロギングフレームワークを橋渡しすることを目的としていますが、実際にはさらに複雑になります。これが事前にわからない場合は、まったく困惑します。ログメッセージがコンソールなどに出力されないのはなぜですか?ああ、私はlog4jではなくTomcatのログを見ているからです。さらに複雑なレイヤーを追加すると、アプリケーションサーバーには、特定のWebアプリケーションのローカル構成を認識できないグローバルロギング構成が含まれる場合があります。最後に、これらのロギングフレームワークはすべて複雑すぎます。Javaでのロギングはまとまりのない混乱であり、私のような開発者は苛立たせて混乱しています。

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


19
これは答えですか?それはもっと暴言のように見えます。
マイケルマイヤーズ

15
ごめんなさい。それほんの少しの怒りです。しかし、これは「Javaでのロギングの概要」への適切な対応でもあります。答えは、要するに、それは深く壊れているということです。
Julien Chastang 2009年

1
まあ、それは-1投票の価値はありません; Pしかし、熟考するために何か。
guyumu 2009年

21
問題は、Sunが実際にjava.util.loggingをJava 1.4に追加したときに始まりました。それ以前は、LOG4Jは十分に確立され、広く使用されていました。その後、LOG4Jとjava.util.loggingの両方をサポートするラッパーが必要になりました。また、julはjava。*パッケージに含まれているため、JARを交換することで置き換えることはできません。これは、SLF4Jが他のフレームワークをブリッジする方法です。これはおそらくこれまでで最悪のSunの考えでした...そして、結局それは「善良なJava市民」がjulを使用すべきであるという誤った仮定につながりました。
Huxi

4
@Huxi、私はCalendar APIの方が悪いと主張しています。Sunを弁護するために、それは彼らのコードではなく、Taglientからのものでした。
–ThorbjørnRavn Andersen 2012

22

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

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

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

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


2
技術的には、これはスレッド固有のMap <String、String>です。
pdxleif 2012


4

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

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

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


4

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

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

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


1
commons.logging => SLF4Jブリッジもあり、SLF4J経由ですべてのCLロギングをルーティングするために使用できます。SLF4Jはcommons.logging、LOG4J、およびjava.util.loggingのブリッジングをサポートしています(少し扱いに​​くいですが、可能な限り優れています)。そのため、すべてのログは、使用するSLF4Jバックエンドに保存されます。slf4j.org/legacy.htmlを参照してください。ところで、Logbackを使用しますが、私は偏っていると主張することもできます。
Huxi

2

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

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

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


1.4への依存を気にしませんでしたか?1.4でさえ、耐用年数の終わりを迎えています。
トム・ホーティン-タックライン09年

2
@トム彼はjdk1.4 +がばかげたことはないことを意味します。
mP。

実際、私は最近jdk 1.3 :-(の下でまだ実行されているシステムでいくつかの作業を行いました、そしてそれは私が最後にjdk 1.2システムを保守していたのは2年未満でした。と、彼らはアップグレードのインストールを拒否します
Michael Rutherfurd

0

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


2
これがCommons Loggingの役割です。なぜホイールを再発明するのでしょうか。また、ファサードがコモンズロギングですでに処理しなければならないいくつかの問題があります。
James AN Stauffer

+1コモンズのロギング引数に対抗するために、一部のエンタープライズアプリはカスタムロガーを使用します。基礎となる実装を隠すことは常に良い考えです。「シン」ラッパーは、パッケージ化される別のjarの必要性を排除し、再発明ほどではありません。
questzen 2008

1
これにより、フレームワークをコンパクトフレームワーク(.Net内)に移植したとき、私は最近助かりました。nLogへの依存関係をハードコーディングしていたとしたら、私たちはねじ込まれていたでしょう。このアプローチを使用したため、ヌルロガーをドロップして満足することができました。誰かが私を0に投票してください:-)
tsimon 2008

3
1つはすでに存在しています-slf4jを見てください。これは、ランタイムクラスパスでjarを切り替えることにより、アプリケーションの起動時にロギングフレームワークを切り替えることができる、受け入れられたシンラッパーです。
2009年

1
目詰まりには、使用するフレームワークを発見する独自の方法があります。Cekiが作成したロギングフレームワークの数。独自のロギングで目詰まりしている場合でも、インターレベルのスロットを設定し、実装を隠すように常に努力する必要があります。その後、Travisが述べたように、好きなf / wをプラグインできます。
mP。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.