web-dev-qa-db-ja.com

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

私は小さな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を介して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のいずれかを使用したいと考えています。また、共通の構成を使用して、古いプロジェクトのログを「新しい」ログフレームワークが最終的に存在するものにマージしたいと考えています。

109
Carl Smotricz

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

111

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

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 ツールを使用して、このようなレポートを生成できます。

enter image description here

41
linuxbuild

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

これは、依存ライブラリが誤って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>
23
Peter L