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

JAG*_*JAG 3 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'
}
Run Code Online (Sandbox Code Playgroud)

库依赖项:

dependencies {
  compile group: 'commons-logging', name: 'commons-logging', version: '1.2'
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

And*_*eas 6

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.

  • 我认为我仍然缺少一些东西,所以让我问一个后续问题:无论我是否排除重复的 JCL 外观,我在我的应用程序中都没有看到任何功能差异。我应该仅仅因为不需要而将其删除吗?如果你愿意的话,这是家务事吗?或者不排除它会产生功能性后果吗?此外,当我包含“jcl-overslf4j”时,我不需要配置两个活动日志记录实现——只需配置 slf4j 委托的那个。那么排除 JCL 我能得到什么? (3认同)