记录框架不兼容

Car*_*icz 109 java compatibility logback apache-commons slf4j

我正在构建一个小型Java应用程序,并希望使用logback进行日志记录.

我的应用程序依赖于通过其进行日志记录的旧项目

org.apache.commons | com.springsource.org.apache.commons.logging | 1.1.1
Run Code Online (Sandbox Code Playgroud)

......所以我的计划是使用

org.slf4j | jcl-over-slf4j | 1.5.6
Run Code Online (Sandbox Code Playgroud)

...将JCL日志记录重定向到

org.slf4j | slf4j-api | 1.6.0
Run Code Online (Sandbox Code Playgroud)

......最终到了

ch.qos.logback | logback-classic | 0.9.22
ch.qos.logback | logback-core | 0.9.22
Run Code Online (Sandbox Code Playgroud)

所以我的应用程序可以通过其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)
Run Code Online (Sandbox Code Playgroud)

我已经在其中一些罐子上尝试过更高和更低的版本号,并且还通过API文档等进行挖掘...但我无法找到并解决问题.

请帮忙?

虽然logback被认为是"战略"日志框架,但我有一些余地,我最终使用哪种日志记录机制.我希望使用logback或log4j,我肯定希望通过常见配置将旧项目的日志记录合并到"新"日志框架最终的任何内容中.

Hol*_*tte 111

您正在将jcl网桥的1.5.6版本与slf4j-api的1.6.0版本混合使用; 由于1.6.0中的一些变化,这将无法工作.两者使用相同的版本,即1.6.1(最新版本).我一直使用jcl-over-slf4j桥,它工作正常.

  • 当然,这很有效; 非常感谢你!我没有使用1.6.1的这些罐子,因为它们似乎没有.我对m2eclipse非常恼火,它声称向我展示了所有可用的版本但神秘地丢失了大量的版本. (2认同)

lin*_*ild 41

SLF4J 1.5.11和1.6.0版本不兼容(请参阅兼容性报告),因为org.slf4j.spi.LocationAwareLogger.log方法的参数列表已更改(添加了Object [] p5):

SLF4J 1.5.11:

LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
                          String p4, Throwable p5 )
Run Code Online (Sandbox Code Playgroud)

SLF4J 1.6.0:

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

请参阅此页面上其他SLF4J版本的兼容性报告.

您可以通过japi-compliance-checker工具生成此类报告.

在此输入图像描述


Pet*_*r L 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>
Run Code Online (Sandbox Code Playgroud)