2010-08-19 109 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