【发布时间】:2018-07-29 01:53:07
【问题描述】:
关于这个主题有几个问题,但我找不到与 Groovy @Slf4j "AST" 注释相关的问题。从表面上看,这不仅方便,而且可以根据日志级别有条件地执行。
在我的《Groovy in Action》一书中,它说:
将 Slf4j 记录器作为静态最终 org.slf4j.Logger 注入到您的 类并使用初始化它 org.slf4j.LoggerFactory.getLogger(class) 。 LogBack 框架使用 SLF4J 作为底层 logger,所以 LogBack 用户应该使用@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]
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 是本书的作者之一。是的,THE Jon Skeet。帮助乔恩!
回答两个 cmets(谢谢!)
...这是输出
+--- 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 的这种使用......并且here 我发现有人想要这样做。
【问题讨论】:
-
您能否将
./gradlew dependencies --configuration runtime的输出添加到您的问题中? -
一个(或多个)依赖项将
slf4j-log4j12添加到您的类路径中。解决方案是追踪它并将其排除在build.gradle中。在不知道您的依赖关系的情况下,我们无法告诉您其中哪一个将slf4j-log4j12添加到类路径中。 -
@SzymonStepniak 谢谢 - 请参阅编辑。你想把你的评论变成答案吗?否则我会自己做一个……(或者我应该删除/标记为骗子?)
-
@mikerodent 很酷,我们可以帮助你 :)
标签: gradle groovy annotations logback slf4j