110

私は小さなJavaアプリを構築していて、ロギングにログバックを使用したいと思っています。

私のアプリは、ログを介してロギングを行う古いプロジェクトに依存しています

org.apache.commons | com.springsource.org.apache.commons.logging | 1.1.1

...だから私の計画は使用することでした

org.slf4j | jcl-over-slf4j | 1.5.6

...JCLログをにリダイレクトする

org.slf4j | slf4j-api | 1.6.0

...そして最終的には

ch.qos.logback | logback-classic | 0.9.22
ch.qos.logback | logback-core | 0.9.22

そのため、私のアプリはslf4j APIを介してログバックを介してログに記録できますが、古いライブラリコードはリダイレクトを介して同じ場所にログインできます。

悲しいかな、これは結果として

java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V
at   org.apache.commons.logging.impl.SLF4JLocationAwareLog.info(SLF4JLocationAwareLog.java:141)

これらのjarのいくつかで検証数を増やしたり減らしたりして、APIドキュメントなどを調べましたが、問題を見つけて解決することができません。

助けてください?

ログバックは「戦略的な」ログフレームワークと見なされますが、最終的に使用するログメカニズムにはある程度の余裕があります。ただし、logbackまたはlog4jのいずれかを使用したいと思います。また、共通の構成を使用して、古いプロジェクトのロギングを「新しい」ロギングフレームワークにマージしたいと思います。

4

3 に答える 3

112

1.5.6バージョンのjclブリッジと1.6.0バージョンのslf4j-apiを混在させています。1.6.0でいくつかの変更があったため、これは機能しません。両方に同じバージョン、つまり1.6.1(最新)を使用します。私はいつもjcl-over-slf4jブリッジを使用していますが、正常に動作します。

于 2010-08-20T07:06:58.967 に答える
41

SLF4J 1.5.11および1.6.0バージョンは、メソッドの引数リストが変更された(Object [] p5が追加された)ため、互換性がありません(互換性レポートを参照)。org.slf4j.spi.LocationAwareLogger.log

SLF4J 1.5.11:

LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
                          String p4, Throwable p5 )

SLF4J 1.6.0:

LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
                          String p4, Object[] p5, Throwable p6 )

このページの他のSLF4Jバージョンの互換性レポートを参照してください。

このようなレポートは、japi-compliance-checkerツールで生成できます。

ここに画像の説明を入力してください

于 2011-04-16T17:56:14.337 に答える
23

私と同じような状況にある人たちを助けるためだけに...

これは、依存ライブラリが誤って古いバージョンのslf4jをバンドルした場合に発生する可能性があります。私の場合、tika-0.8でした。https://issues.apache.org/jira/browse/TIKA-556を参照してください

回避策は、コンポーネントを除外してから、正しいバージョンまたはパッチを適用したバージョンに手動で依存することです。

例えば。

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers</artifactId>
    <version>0.8</version>
    <exclusions>
        <exclusion>
            <!-- NOTE: Version 4.2 has bundled slf4j -->
            <groupId>edu.ucar</groupId>
            <artifactId>netcdf</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <!-- Patched version 4.2-min does not bundle slf4j -->
    <groupId>edu.ucar</groupId>
    <artifactId>netcdf</artifactId>
    <version>4.2-min</version>
</dependency>
于 2010-12-01T04:43:33.750 に答える