2010-08-19 142 views
108

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

我已经在一些罐子尝试更高和更低verision号并通过API文档和挖掘等......但我无法找到并解决问题。

请帮忙吗?

尽管logback被认为是“战略性”日志框架,但我仍有一些余地,我最终使用日志机制。不过,我希望可以使用logback或log4j,而且我确实希望通过通用配置将旧项目的日志记录合并到“新”日志记录框架的最终结果中。

回答

110

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

+2

那当然有效;非常感谢你!我没有使用这些罐子的1.6.1,因为它们看起来不可用。我对m2eclipse非常恼火,它旨在向我展示所有可用的版本,但神秘地丢弃了大量的版本。 – 2010-08-20 07:45:18

+1

仅仅为了其他人的兴趣:我最终在依赖图中出现了红色箭头,因为即使最新的logback-core也坚持使用slf4j-1.6.0。在所有红色箭头消失之前,花了更多的时间来处理版本,但现在它既可以工作也可以全部使用蓝色箭头。 – 2010-08-20 08:32:10

+1

我到底该怎么做。 – user1721803 2014-09-23 23:29:15

23

只是为了帮助那些在类似情况下,以自己...

当相关库意外地捆绑的是旧版本的SLF4J可能导致这个结果。就我而言,它是tika-0.8。请参阅https://issues.apache.org/jira/browse/TIKA-556

解决方法是排除组件,然后手动依赖正确或修补的版本。

EG。

<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> 
+0

谢谢!当试图在SLF4J 1.6.1和Logback 0.9.28上使用Jackrabbit 2.2.5时,我受到了这个打击! – 2011-04-08 07:01:13

+0

谢谢。我在这里链接到你的答案:http://spring-java-ee.blogspot.com/2011/04/using-jackrabbit-jcr-225-with-slf4j-161.html – 2011-04-08 12:14:59

41

SLF4J 1.5.11和1.6.0版本不兼容(参见compatibility report),因为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.0:

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

见兼容性报告FO其他SLF4J版本on this page

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

enter image description here