为什么在使用slf4j时排除公共日志记录?

时间:2018-12-11 03:40:59

标签: java logging slf4j

我正在构建一个简单的应用程序,以便可以了解slf4j,桥接库,日志记录实现等。我的应用程序依赖于slf4j,后者将logback用于日志记录实现。另外,它引入了一个包含commons-logging库的库。

应用程序依赖项:

  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'
}

当我包括jcl-over-slf4j时,该库将按预期方式通过JCL输出其日志记录。当我执行包含jcl-over-slf4j时,slf4j将通过JCL记录器进行的任何日志记录都提取并重定向到logback。

我一直在Internet上阅读文章,说如果我的应用程序依赖slf4j和依赖JCL的库,则必须排除commons-logging依赖项。但是,这似乎没有必要,而且我不明白为什么。在什么情况下我必须排除JCL依赖关系?我的例子太简单了,无法暴露潜在的问题吗?

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

1 个答案:

答案 0 :(得分:1)

JCL和SLF都是日志记录的外观,即它们只是一个抽象了日志记录实现的API。

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

为什么要使用两个活动的日志记录实现,这些实现需要分别配置,并且必须记录到不同的日志文件中?

您没有,并且您的应用程序选择使用Logback,并且选择JCL应该调用SLF(jcl-over-slf4j),因此无论代码是调用JCL还是SLF都无关紧要通过Logback完成。

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