我正在构建一个小型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,我肯定希望通过常见配置将旧项目的日志记录合并到“新”日志框架最终的任何内容中 .
3 回答
只是为了帮助那些处于类似情况的人...
当依赖库意外捆绑旧版本的slf4j时,可能会导致此问题 . 就我而言,它是tika-0.8 . 见https://issues.apache.org/jira/browse/TIKA-556
解决方法是排除组件,然后手动依赖正确或修补的版本 .
例如 .
您正在将jcl网桥的1.5.6版本与slf4j-api的1.6.0版本混合使用;由于1.6.0中的一些变化,这将无法工作 . 两者使用相同的版本,即1.6.1(最新版本) . 我一直使用jcl-over-slf4j桥,它工作正常 .
SLF4J 1.5.11和1.6.0版本不兼容(请参阅compatibility report),因为
org.slf4j.spi.LocationAwareLogger.log
方法的参数列表已更改(添加了Object [] p5):SLF4J 1.5.11:
SLF4J 1.6.0:
请参阅其他SLF4J版本on this page的兼容性报告 .
您可以通过japi-compliance-checker工具生成此类报告 .