日志记录框架不兼容

我正在构建一个小型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上尝试了更高和更低的verrision数字,并且还挖掘了API文档等...但我无法找到并解决问题。

请帮忙吗?

虽然 logback 被认为是“战略性”日志记录框架,但我最终在哪种日志记录机制方面有一些余地。不过,我希望使用logback或log4j,而且我肯定希望通过通用配置将旧项目的日志记录合并到“新”日志记录框架最终出现的任何位置。


答案 1

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


答案 2

SLF4J 1.5.11 和 1.6.0 版本不兼容(请参阅兼容性报告),因为方法的参数列表已更改(添加了 Object[] p5):org.slf4j.spi.LocationAwareLogger.log

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 合规性检查器工具生成此类报告。

enter image description here


推荐