2015-06-20 68 views
2

我有一個項目,我使用log4j進行日誌記錄,它用於很好的工作。現在,我不得不添加一個依賴項,它使用slf4j,並且突然間日誌記錄不再按預期工作 - 代碼的某些部分忽略了log4j配置並在Eclipse控制檯中登錄爲紅色。slf4j依賴打破log4j配置的問題

這是依賴關係樹日誌記錄時的工作:

my.package.program:program-database:jar:0.3.0 
+- my.package.program:program-common:jar:0.3.0:compile 
| +- org.apache.commons:commons-lang3:jar:3.4:compile 
| \- commons-io:commons-io:jar:2.4:compile 
+- org.springframework:spring-tx:jar:4.1.0.RELEASE:compile 
| \- org.springframework:spring-core:jar:4.1.0.RELEASE:compile 
|  \- commons-logging:commons-logging:jar:1.1.3:compile 
+- org.springframework:spring-jdbc:jar:4.1.0.RELEASE:compile 
+- org.jooq:jooq:jar:3.6.2:compile 
+- org.jooq:jooq-meta:jar:3.6.2:compile 
+- org.jooq:jooq-codegen:jar:3.6.2:compile 
+- postgresql:postgresql:jar:9.1-901-1.jdbc4:compile 
+- org.springframework:spring-beans:jar:4.1.0.RELEASE:compile 
+- org.springframework:spring-context:jar:4.1.0.RELEASE:compile 
| +- org.springframework:spring-aop:jar:4.1.0.RELEASE:compile 
| | \- aopalliance:aopalliance:jar:1.0:compile 
| \- org.springframework:spring-expression:jar:4.1.0.RELEASE:compile 
+- org.apache.logging.log4j:log4j-api:jar:2.1:compile 
+- org.apache.logging.log4j:log4j-core:jar:2.1:compile 
+- org.apache.logging.log4j:log4j-1.2-api:jar:2.1:compile 
+- junit:junit:jar:4.11:test 
| \- org.hamcrest:hamcrest-core:jar:1.3:test 
+- org.springframework:spring-test:jar:4.1.0.RELEASE:test 

這是後我加飛路插件,它打破記錄的樹:

my.package.program:program-database:jar:0.3.0 
+- my.package.program:program-common:jar:0.3.0:compile 
| +- org.apache.commons:commons-lang3:jar:3.4:compile 
| \- commons-io:commons-io:jar:2.4:compile 
+- org.springframework:spring-tx:jar:4.1.0.RELEASE:compile 
| \- org.springframework:spring-core:jar:4.1.0.RELEASE:compile 
|  \- commons-logging:commons-logging:jar:1.1.3:compile 
+- org.springframework:spring-jdbc:jar:4.1.0.RELEASE:compile 
+- org.jooq:jooq:jar:3.6.2:compile 
+- org.jooq:jooq-meta:jar:3.6.2:compile 
+- org.jooq:jooq-codegen:jar:3.6.2:compile 
+- postgresql:postgresql:jar:9.1-901-1.jdbc4:compile 
+- org.flywaydb.flyway-test-extensions:flyway-spring-test:jar:3.2.1:test 
| +- org.slf4j:slf4j-api:jar:1.5.6:test 
| +- org.slf4j:slf4j-simple:jar:1.5.6:test 
| +- org.flywaydb:flyway-core:jar:3.2.1:test 
| \- commons-dbcp:commons-dbcp:jar:1.4:test 
|  \- commons-pool:commons-pool:jar:1.5.4:test 
+- org.springframework:spring-beans:jar:4.1.0.RELEASE:compile 
+- org.springframework:spring-context:jar:4.1.0.RELEASE:compile 
| +- org.springframework:spring-aop:jar:4.1.0.RELEASE:compile 
| | \- aopalliance:aopalliance:jar:1.0:compile 
| \- org.springframework:spring-expression:jar:4.1.0.RELEASE:compile 
+- org.apache.logging.log4j:log4j-api:jar:2.1:compile 
+- org.apache.logging.log4j:log4j-core:jar:2.1:compile 
+- org.apache.logging.log4j:log4j-1.2-api:jar:2.1:compile 
+- junit:junit:jar:4.11:test 
| \- org.hamcrest:hamcrest-core:jar:1.3:test 
+- org.springframework:spring-test:jar:4.1.0.RELEASE:test 

我認爲問題來自於一個事實那春天包括commons-logging的傳遞依賴關係,當flyway拉入slf4j時,cli獲得優先權,而我的log4j配置被某些庫忽略(例如jooq和flyway開始登錄爲紅色)。

我嘗試了這裏提到的所有3個選項: http://www.slf4j.org/faq.html#excludingJCL 但一些爲什麼他們都沒有工作。當然有一個效果,但在解決方案2和3之後,春天也開始登錄紅色。

試圖在不同的SLF4J綁定和橋樑盲目插頭,沒有運氣之後 - 我必須承認,我不知道日誌框架不夠好,拿出一個解決方案自己。任何幫助和建議都會受到歡迎。

回答

2

原來我的問題是由飛行用彈簧測的擴展,它是包括作爲一個依賴SLF4J,簡單的綁定引起的。即使我自己添加了log4j綁定,仍然使用slf4j-simple綁定,因此我的log4j配置對使用slf4j進行日誌記錄的代碼部分沒有影響。

使問題進一步複雜化,jOOQ檢查在加載時的日誌框架和如果發現寧願SLF4J - 所以加與飛路 - 彈簧 - 測試延長SLF4J依賴被迫jOOQ自動切換日誌框架,創建更多的混亂爲了我。

最後,一旦有人清楚,究竟是什麼的問題的原因,修復很簡單 - 刪除SLF4J-簡單的綁定,並添加SLF4J-log4j的結合。由於版本不匹配問題,我不得不用新版本替換slf4j-api依賴項。我採取的步驟是:

  1. 剔除org.slf4j:從飛行用彈簧測依賴
  2. SLF4J的API不包括org.slf4j:SLF4J-簡單從飛行用彈簧測依賴
  3. 添加新org.slf4j的版本:SLF4J的API到項目
  4. 添加org.apache.logging.log4j:log4j的-SLF4J-implement執行到項目

記錄似乎現在的工作。最終的依賴關係樹是:

my.package.program:program-database:jar:0.3.0 
+- my.package.program:program-common:jar:0.3.0:compile 
| +- org.apache.commons:commons-lang3:jar:3.4:compile 
| \- commons-io:commons-io:jar:2.4:compile 
+- org.springframework:spring-tx:jar:4.1.0.RELEASE:compile 
| \- org.springframework:spring-core:jar:4.1.0.RELEASE:compile 
|  \- commons-logging:commons-logging:jar:1.1.3:compile 
+- org.springframework:spring-jdbc:jar:4.1.0.RELEASE:compile 
+- org.jooq:jooq:jar:3.6.2:compile 
+- org.jooq:jooq-meta:jar:3.6.2:compile 
+- org.jooq:jooq-codegen:jar:3.6.2:compile 
+- postgresql:postgresql:jar:9.1-901-1.jdbc4:compile 
+- org.flywaydb.flyway-test-extensions:flyway-spring-test:jar:3.2.1:test 
| +- org.flywaydb:flyway-core:jar:3.2.1:test 
| \- commons-dbcp:commons-dbcp:jar:1.4:test 
|  \- commons-pool:commons-pool:jar:1.5.4:test 
+- org.springframework:spring-beans:jar:4.1.0.RELEASE:compile 
+- org.springframework:spring-context:jar:4.1.0.RELEASE:compile 
| +- org.springframework:spring-aop:jar:4.1.0.RELEASE:compile 
| | \- aopalliance:aopalliance:jar:1.0:compile 
| \- org.springframework:spring-expression:jar:4.1.0.RELEASE:compile 
+- org.apache.logging.log4j:log4j-api:jar:2.3:compile 
+- org.apache.logging.log4j:log4j-core:jar:2.3:compile 
+- org.apache.logging.log4j:log4j-1.2-api:jar:2.3:compile 
+- org.apache.logging.log4j:log4j-slf4j-impl:jar:2.3:compile 
+- org.slf4j:slf4j-api:jar:1.7.12:compile 
+- junit:junit:jar:4.11:test 
| \- org.hamcrest:hamcrest-core:jar:1.3:test 
+- org.springframework:spring-test:jar:4.1.0.RELEASE:test 
+0

這並不是真正的準確,因爲Flyway本身對任何日誌框架都沒有必要的依賴關係。然而,它將在運行時檢測到您在類路徑中的一個並使用它。 –

+0

是的,這個依賴並不是直接來自Flyway--當我開始在構建中使用flyway-spring-test組件時就被拉進來了。我會修改我的答案以反映 – Tarmo

+0

@AxelFontaine:有趣的,你是如何做到的?只有反思? –