logging框架不兼容

我正在构build一个小的Java应用程序,并希望使用logback进行日志logging。

我的应用程序依赖于一个较老的项目,通过它进行日志logging

org.apache.commons | com.springsource.org.apache.commons.logging | 1.1.1 

…所以我的计划是使用

 org.slf4j | jcl-over-slf4j | 1.5.6 

…将JCL日志redirect到

 org.slf4j | slf4j-api | 1.6.0 

最终…

 ch.qos.logback | logback-classic | 0.9.22 ch.qos.logback | logback-core | 0.9.22 

所以我的应用程序可以通过它的slf4j APIloginlogback,而旧的库代码可以通过redirectlogin到同一个位置。

唉,这个结果

 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文档等…但我无法find并解决问题。

请帮助?

尽pipelogback被认为是“战略性”的日志框架,但是我最终还是会使用日志机制。 我希望可以使用logback或log4j,但是我确实希望通过一个通用的configuration将旧的项目的日志logging合并到“新”日志框架中。

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

由于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工具生成这样的报告。

在这里输入图像说明

只是为了帮助那些与我自己类似的情况

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