46

Dave Syer (SpringSource)はブログに次のように書いています。

残念なことに、commons-logging の最悪の点と、新しいツールで人気がなくなった原因は、ランタイム検出アルゴリズムでもあります。

なんで?ランタイム検出アルゴリズムの問​​題は何ですか? パフォーマンス?

4

4 に答える 4

81

なんで?ランタイム検出アルゴリズムの問​​題は何ですか? パフォーマンス?

いいえ、それはパフォーマンスではなく、クラスローダーの痛みです。JCL ディスカバリ プロセスは、実行時にロギング フレームワークを見つけるためにクラスローダのハックに依存していますが、このメカニズムは、予期しない動作、複雑さの増大につながるクラスローディングの問題のデバッグの困難など、多くの問題を引き起こします。これは Ceki (Log4J、SLF4J、および Logback の作成者) によってよく考えられており、コモンズ ロギング API を採用する前にもう一度考えてください(JCL で観察されるメモリ リークの問題についても言及しています)。

これが、静的バインディングを使用する SLF4J が作成された理由です。

Ceki は SLF4J の著者であるため、彼の記事は偏っていると思うかもしれませんが、そうではなく、彼は自分の主張を証明するために多くの参考文献 (証拠) を提供しています。

総括する:

  • はい、JCL は壊れていることが知られています。
  • ロギング ファサードを使用する場合 (すべてのプロジェクトで必要なわけではありません)、SLF4J を使用します。
  • SLF4J は、Spring のような JCL をまだ使用しているフレームワークに JCL-to-SLF4J ブリッジを提供します:(
  • Log4J の後継である Logback は、優れたロギング実装であることがわかりました。
  • Logback は SLF4J API をネイティブに実装します。これは、Logback を使用している場合、実際には SLF4J API を使用していることを意味します。

こちらもご覧ください

于 2010-07-11T16:05:59.153 に答える
14

Commons logging は、 log4j、 java.util.logging 、またはサポートされている別のロギング API である重いロギング API の上に配置される軽量のロギング ファサードです。

検出アルゴリズムは、コモンズ ロギングが実行時に使用するロギング API を決定するために使用するものであり、その API を介してログ呼び出しを基になるロギング API に送信できます。これの利点は、ロギングを行うライブラリを作成したい場合に、ライブラリのユーザーを特定の負荷の高いロギング システムに縛り付けたくないということです。コードの呼び出し元は、log4j、java.util.logging などを介してログを構成でき、コモンズのログは実行時にその API に転送されます。

コモンズロギングの一般的な不満:

  • 使用していなくても、依存するライブラリがある可能性があるため、とにかくクラスパスに含める必要があります。
  • ログインするクラスローダーごとに検出アルゴリズムを実行します。これにより、望ましくない結果が生じる可能性があるため、commons-logging.jar を適切なクラスローダーに配置してください。
  • 基礎となるロギング フレームワークよりも複雑です。
  • 基礎となるロギング フレームワークより少ない機能。

複雑なクラスパス階層の複雑さと予測不可能性が認識され、利点が認識されていないため、commons-logging のユーザーは動揺しています。また、この選択が強制される可能性があることを考えると、ユーザーは同情しません。 commons-logging の使用に対する説得力のある議論については、この記事を参照してください。

于 2010-07-11T11:48:27.740 に答える
2

「人気がないと信じられている」側面について話すことはできません。自分自身について話すことしかできません。

Commons Logging は、「実際の」ロギング フレームワーク (Log4j、Logback など) の上にあるファサードです。

ロギング ファサードの考え方は、アプリケーションがどのロギング実装と連携するかを実行時に決定する柔軟性を得るということです。ファサードは、実行時にロギングの実装を見つけるのに十分なほど賢いです。

私の古い Java アプリは Log4j を直接使用しています。正常に動作します。変更する必要はありません。私の新しい Java アプリはおそらく Logback を使用するでしょう。ロギング フレームワークを動的に選択する機能は、私のアプリで必要になることはないと思います。もちろん、他の人の走行距離は異なる場合があります。


編集: Commons Logging の根拠について間違っていたようです。@Pascal Thivent によって提供されたリンク、特に最初のリンクは、これをはるかによく説明しています。

于 2010-07-11T11:46:50.977 に答える
1

Commons Logging には、実行時に log4j と java.util.logging.* のどちらを使用するかを決定するロジックが含まれています。

そのコードは以前は深刻に壊れていて、基本的に JUL でしか動作しませんでした。

これに関する経験に基づいて、log4j、JUL、またはlog4j fork logback(およびその他)を使用するための適切なフレームワークを選択するために、静的バインディングを使用する(またはバージョン1.6ではよくわかりません)slf4jが作成されました。既存の Commons Logging コードが slf4j を透過的に使用できるようにするブリッジ。

可能であれば、slf4j を選択してください。

于 2010-07-11T13:16:15.993 に答える