110

我正在构建一个小型 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 被认为是“战略”日志框架,但我对最终使用的日志机制有一些余地。不过,我希望使用 logback 或 log4j,并且我肯定希望通过通用配置将旧项目的日志记录合并到“新”日志记录框架最终成为的任何内容中。

4

3 回答 3

112

You are mixing the 1.5.6 version of the jcl bridge with the 1.6.0 version of the slf4j-api; this won't work because of a few changes in 1.6.0. Use the same versions for both, i.e. 1.6.1 (the latest). I use the jcl-over-slf4j bridge all the time and it works fine.

于 2010-08-20T07:06:58.967 回答
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 )

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 回答