slf4j依赖性破坏log4j配置的问题

时间:2015-06-20 23:28:47

标签: java maven log4j slf4j flyway

我有一个项目,我使用log4j进行日志记录,它曾经很好用。现在我不得不添加一个依赖项,它使用了slf4j,突然间日志记录不再按预期工作了 - 代码的某些部分忽略了我的log4j配置并在Eclipse控制台中以红色登录。

这是记录工作时的依赖关系树:

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

这是我添加了一个flyway插件并打破了日志记录之后的树:

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

我认为问题来自于spring包含commons-logging的传递依赖性,当flyway在slf4j中获取时,cli获得优先级,并且某些库忽略了我的log4j配置(等等jooq和flyway开始以红色登录)。

我尝试了这里提到的所有3个选项: http://www.slf4j.org/faq.html#excludingJCL 但有些人为什么没有工作。肯定会产生影响,但在解决方案2和3之后,spring也开始记录为红色。

在尝试盲目地插入不同的slf4j绑定和桥接并且没有运气之后 - 我不得不承认我不熟悉日志框架以便自己提出解决方案。欢迎任何帮助和建议。

1 个答案:

答案 0 :(得分:2)

原来我的问题是由flyway-spring-test扩展引起的,其中包括slf4j-simple绑定作为依赖。即使我自己添加了log4j绑定,仍然使用了slf4j-simple绑定,因此我的log4j配置对使用slf4j进行日志记录的代码部分没有影响。

为了使问题进一步复杂化,jOOQ在加载时检查日志框架并且如果找到它则更喜欢slf4j - 所以使用flyway-spring-test扩展添加slf4j依赖强制jOOQ自动切换日志框架,造成更多的混淆我

最后,一旦明确了,问题的原因是什么,修复很简单 - 删除slf4j-simple绑定并添加slf4j-log4j绑定。由于版本不匹配问题,我不得不用更新的版本替换slf4j-api依赖项。我采取的步骤是:

  1. 从flyway-spring-test依赖项中排除org.slf4j:slf4j-api
  2. 从flyway-spring-test依赖项中排除org.slf4j:slf4j-simple
  3. 将更新版本的org.slf4j:slf4j-api添加到项目中
  4. 将org.apache.logging.log4j:log4j-slf4j-impl添加到项目中
  5. 记录现在似乎有效。最终的依赖树是:

    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