ロギングフレームワークの非互換性


109

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

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

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を介してlogbackを介してログを記録でき、一方、古いライブラリコードは、リダイレクトを介して同じ場所にログインできます。

悲しいかな、これは

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のいずれかを使用したいのですが、共通の構成を使用して、古いプロジェクトのロギングを「新しい」ロギングフレームワークが最終的に何になるかにマージしたいと思います。

回答:


111

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


2
もちろん、それはすぐに機能しました。どうもありがとうございました!それらが利用可能であるように見えなかったので、それらの1.6.1を使用していませんでした。私はm2eclipseに非常にイライラしています。m2eclipseは、利用可能なすべてのバージョンを表示するつもりですが、それらのかなりの数を不思議なことにドロップします。
Carl Smotricz、2010

1
最新のlogback-coreでさえslf4j-1.6.0を要求しているため、次の誰かのために、依存関係グラフに赤い矢印が表示されました。すべての赤い矢印が消えるまで、バージョンをさらにいじくり回しましたが、現在は機能しており、すべての青い矢印が機能しています。
Carl Smotricz、2010

1
正確にはどうすればよいですか。
user1721803 2014

おかげで...「jcl-over-slf4j」を使用して私の日を救った。
Tariq M Nasim

41

メソッドの引数リストが変更されているため(Object [] p5が追加されているため)、SLF4J 1.5.11バージョンと1.6.0バージョンは互換性がありません(互換性レポートを参照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ツールで生成できます。

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


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>

ありがとう!Jackrabbit 2.2.5をSLF4J 1.6.1およびLogback 0.9.28で使用しようとすると、この問題に遭遇しました。
ヘンディイラワン

ありがとう。:私はここにあなたの答えにリンクされているspring-java-ee.blogspot.com/2011/04/...
Hendy Irawan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.