时髦@Slf4j注释:"Class path contains multiple SLF4J bindings"



关于此主题有几个问题,但我可以找到的没有任何问题与groovy @Slf4j" ast"注释。从表面上看,这不仅方便,而且可以根据日志级别的有条件执行内容。

在我的书中,groovy在行动中说:

将SLF4J记录器注射为静态最终org.slf4j.logger 类并使用 org.slf4j.loggerfactory.getlogger(class(。日志框架使用 slf4j作为基础记录器,因此记录到back用户应使用 @slf4j

这就是我在做的。我在我的gradle.build

compile 'ch.qos.logback:logback-classic:1.2.1'

...我已经为简单的logback-test.xml。

但是,每次我使用此注释进行测试类,或直接运行应用程序,我都会得到:

SLF4J:类路径包含多个SLF4J绑定。SLF4J:发现 在[jar:file:/d:/apps/...中绑定 fbb0e/logback-classic-1.2.1.jar!/org/slf4j/impl/staticloggerbinder.class]
SLF4J:在[jar:file:/d:/apps/... ECA4E/SLF4J-LOG4J12-1.7.6.JAR!/org/slf4j/impl/staticloggerbinder.class.class]
SLF4J:请参阅http://www.slf4j.org/codes.html#multiple_bindings 解释。
SLF4J:实际绑定是类型 [ch.qos.logback.classic.util.contextselectorstaticbinder]

...特别是这是"污染"我的测试的stderr输出。

我尝试手动删除slf4j-log4j12-1.7.6.jar文件...但是它自动重生下一个gradle任务。

乔恩·斯基特(Jon Skeet(是本书的作者之一。是的, Jon Skeet。帮助乔恩!

在回答两个注释(谢谢!(
...这是输出

+--- org.codehaus.groovy:groovy-all:2.6.0-alpha-2
+--- net.bytebuddy:byte-buddy:1.6.11
+--- commons-io:commons-io:2.6
+--- org.apache.odftoolkit:simple-odf:0.8.2-incubating
|    +--- org.apache.odftoolkit:odfdom-java:0.8.11-incubating
|    |    +--- org.apache.odftoolkit:taglets:0.8.11-incubating
|    |    +--- xerces:xercesImpl:2.9.1 -> 2.11.0
|    |    |    --- xml-apis:xml-apis:1.4.01
|    |    +--- xml-apis:xml-apis:1.3.04 -> 1.4.01
|    |    +--- org.apache.jena:jena-core:2.11.2
|    |    |    +--- org.slf4j:slf4j-api:1.7.6 -> 1.7.22
|    |    |    +--- org.apache.jena:jena-iri:1.0.2
|    |    |    |    +--- org.slf4j:slf4j-api:1.7.6 -> 1.7.22
|    |    |    |    --- log4j:log4j:1.2.17
|    |    |    +--- xerces:xercesImpl:2.11.0 (*)
|    |    |    --- log4j:log4j:1.2.17
|    |    +--- net.rootdev:java-rdfa:0.4.2
|    |    |    +--- org.apache.jena:jena-iri:0.9.1 -> 1.0.2 (*)
|    |    |    --- org.slf4j:slf4j-api:1.5.6 -> 1.7.22
|    |    --- commons-validator:commons-validator:1.5.0
|    |         +--- commons-beanutils:commons-beanutils:1.9.2
|    |         |    +--- commons-logging:commons-logging:1.1.1 -> 1.2
|    |         |    --- commons-collections:commons-collections:3.2.1 -> 3.2.2
|    |         +--- commons-digester:commons-digester:1.8.1
|    |         +--- commons-logging:commons-logging:1.2
|    |         --- commons-collections:commons-collections:3.2.2
|    +--- xerces:xercesImpl:2.9.1 -> 2.11.0 (*)
|    --- xml-apis:xml-apis:1.3.04 -> 1.4.01
+--- org.apache.lucene:lucene-core:6.+ -> 6.6.2
+--- org.apache.lucene:lucene-analyzers-common:6.+ -> 6.6.2
|    --- org.apache.lucene:lucene-core:6.6.2
+--- org.apache.lucene:lucene-queryparser:6.+ -> 6.6.2
|    +--- org.apache.lucene:lucene-core:6.6.2
|    +--- org.apache.lucene:lucene-queries:6.6.2
|    --- org.apache.lucene:lucene-sandbox:6.6.2
+--- commons-io:commons-io:2.5 -> 2.6
--- ch.qos.logback:logback-classic:1.2.1
     +--- ch.qos.logback:logback-core:1.2.1
     --- org.slf4j:slf4j-api:1.7.22

显然,Szymon Stepniak的评论是正确的。现在,我只需要找出如何通过罪魁祸首(Odftoolkit(软件包排除log4j的使用...在这里我发现一个想精确执行此操作的人。

您在控制台中看到的此错误消息实际上与代码中使用的@Slf4j注释无关 - 它只是简化了将log字段添加到类中。您的问题是由类Path中的多个org.slf4j.impl.StaticLoggerBinder类引起的。要修复它,您必须首先使用以下方式检查依赖关系树

gradle dependencies --configuration runtime

它将显示一棵大树的所有依赖性树。比您可以追踪哪个依赖关系正在向您的类路径添加其他记录仪。正如您在评论中提到的那样,在您的情况下,它是 org.apache.odftoolkit:simple-odf:0.8.2-incubating添加 log4j依赖项。

知道您必须排除org.apache.odftoolkit:simple-odf:0.8.2-incubating随附的org.slf4jlog4j组的传递依赖性。在您的build.gradle文件中定义此依赖性如下:

compile ("org.apache.odftoolkit:simple-odf:0.8.2-incubating") {
    exclude group: 'org.slf4j'
    exclude group: 'log4j'
}

只是为了兴趣,尽管szymon stepniak的解决方案可能是最好的方法,但还有另一个解决方案,我从本质上获得了这个问题:

configurations {
    runtime.exclude group: "org.slf4j", module: "slf4j-log4j12"
}

...我想这可能有一个优势,您不必单独处理每个有问题的软件包的排除...?

最新更新