【问题标题】:Logging framework incompatibility日志框架不兼容
【发布时间】:2011-04-01 00:04:56
【问题描述】:

我正在构建一个小型 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,而且我肯定希望通过通用配置将旧项目的日志记录合并到“新”日志记录框架最终成为的任何内容中。

【问题讨论】:

    标签: java compatibility apache-commons slf4j logback


    【解决方案1】:

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

    【讨论】:

    • 当然,这很快就奏效了;非常感谢!我没有使用 1.6.1 的这些罐子,因为它们似乎不可用。我对 m2eclipse 非常恼火,它声称向我展示了所有可用的版本,但却神秘地放弃了其中的大量版本。
    • 只是为了关注其他人的兴趣:我最终在依赖图中得到了一个红色箭头,因为即使是最新的 logback-core 也坚持使用 slf4j-1.6.0。在所有的红色箭头都消失之前,它花了更多的时间来处理版本,但现在它既可以工作,而且所有的蓝色箭头都可以使用。
    • 我该怎么做。
    • 谢谢...使用 'jcl-over-slf4j' 拯救了我的一天。
    【解决方案2】:

    SLF4J 1.5.11 和 1.6.0 版本不兼容(参见compatibility report),因为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 版本的兼容性报告on this page

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

    【讨论】:

      【解决方案3】:

      只是为了帮助那些与我处境相似的人......

      当依赖库意外捆绑了旧版本的 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>
      

      【讨论】:

      • 谢谢!当我尝试将 Jackrabbit 2.2.5 与 SLF4J 1.6.1 和 Logback 0.9.28 一起使用时,我受到了打击!
      • 谢谢。我在这里链接到你的答案:spring-java-ee.blogspot.com/2011/04/…
      猜你喜欢
      • 2011-06-28
      • 2020-01-19
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      相关资源
      最近更新 更多