代码之家  ›  专栏  ›  技术社区  ›  Carl Smotricz

日志框架不兼容

  •  108
  • Carl Smotricz  · 技术社区  · 14 年前

    我正在构建一个小型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)
    

    我试过在一些罐子上使用更高和更低的版本号,也试过挖掘API文档等等……但我找不到解决这个问题。

    请帮忙,好吗?

    虽然logback被认为是“战略”日志框架,但我有一定的余地最终使用日志机制。不过,我希望使用logback或log4j,并且我肯定希望通过一个公共配置,将旧项目的日志记录合并到“新”的日志框架中。

    3 回复  |  直到 8 年前
        1
  •  110
  •   Holger Hoffstätte    14 年前

    您将JCL桥的1.5.6版本与SLF4J API的1.6.0版本混合在一起;由于1.6.0中的一些更改,这将不起作用。两者使用相同的版本,即1.6.1(最新版本)。我一直在使用JCL-over-SLF4J桥,它工作得很好。

        2
  •  41
  •   linuxbuild    8 年前

    slf4j 1.5.11和1.6.0版本不兼容(请参阅 compatibility report )因为参数列表的 org.slf4j.spi.locationawarelogger.log method has been changed(added object[]p5):。

    SLF4J 1.5.11:。

    locationawarelogger.log(org.slf4j.marker p1,string p2,int p3,
    字符串p4,可丢弃的p5)
    < /代码> 
    
    

    SLF4J 1.6.0型:

    locationawarelogger.log(org.slf4j.marker p1,string p2,int p3,
    字符串p4,对象[]p5,可丢弃p6)
    < /代码> 
    
    

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

    您可以通过以下方式生成此类报告:japi compliance checkertool.

    )因为参数列表org.slf4j.spi.LocationAwareLogger.log方法已更改(添加了对象[]p5):

    SLF4J 1.5.11:

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

    SLF4J 1.6:

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

    请参阅其他SLF4J版本的兼容性报告on this page.

    您可以通过japi-compliance-checker工具。

    enter image description here

        3
  •  23
  •   Peter L    14 年前

    只是为了帮助那些和我处境相似的人…

    这可能是由于一个依赖库意外地捆绑了一个旧版本的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>