在使用slf4j时,为什么要排除commons日志记录



我正在构建一个非常简单的应用程序,以便了解slf4j、桥接库、日志记录实现等。我的应用程序依赖于slf4j,它使用logback实现日志记录。此外,它还引入了一个库,其中包括commons日志库。

应用程序相关性:

dependencies {
compile project(':library-with-jcl')
compile group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.25'
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
}

库相关性:

dependencies {
compile group: 'commons-logging', name: 'commons-logging', version: '1.2'
}

当I不包含jcl-over-slf4j时,库将按预期通过JCL输出其日志记录。当Ido包含jcl-over-slf4j时,通过JCL记录器的任何日志记录都会被slf4j获取并重定向到logback。

我一直在网上读文章,说如果我的应用程序依赖于slf4j和依赖于JCL的库,我必须排除commons-logging依赖性。然而,这似乎没有必要,我也不明白为什么。在什么情况下我必须排除JCL依赖关系?我在这里的例子是否过于简单而无法暴露潜在的问题?

此外,如果我使用log4j桥,我没有看到必须从依赖它的库中排除log4j依赖项的建议。为什么不呢?JCL是特例吗?

JCL和SLF都是日志的门面,也就是说,它们只是一个抽象掉日志实现的API。

JUL(java.util.logging(和Logback是日志记录实现。默认情况下,JCL将调用JUL,SLF将调用Logback。

为什么需要两个活动日志记录实现,它们需要单独配置,并且必须记录到不同的日志文件?

您没有,并且您的应用程序已经选择使用Logback,并选择JCL应该调用SLF(jcl-over-slf4j(,因此无论代码调用JCL还是SLF,日志记录都将由Logback完成。

因此,您需要删除(排除(库依赖项添加的重复JCL facade,该facade现在由jcl-over-slf4j实现。

最新更新