web-dev-qa-db-ja.com

Apache CommonsLoggingのランタイム検出アルゴリズムの問​​題は何ですか

Dave Syer(SpringSource) 書き込み 彼のブログ:

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

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

43
Ta Sas

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

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

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

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

総括する:

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

も参照してください

76
Pascal Thivent

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

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

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

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

複雑なクラスパス階層では、認識されたより複雑で予測不可能であり、認識された利点がないため、コモンズロギングのユーザーは興奮します。また、この選択が強制される可能性があることを考えると、ユーザーは同情しません。 この記事を参照 commons-loggingの使用に反対する説得力のある議論。

12
krock

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

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

ロギングファサードの考え方は、アプリが実行時にどのロギング実装を使用するかを柔軟に決定できるようにすることです。ファサードは、実行時にロギングの実装を見つけるのに十分賢いです。

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


編集:コモンズロギングの理論的根拠について私が間違っていたようです。 @Pascal Thiventによって提供されたリンク、特に最初のリンクは、これをはるかによく説明しています。

2
Carl Smotricz

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

そのコードは、本質的にJULでのみ機能し、深刻に壊れていました。

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

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