【问题标题】:Why exclude commons-logging when using slf4j?为什么在使用 slf4j 时排除 commons-logging?
【发布时间】:2019-05-12 00:35:27
【问题描述】:

我正在构建一个非常简单的应用程序,以便我可以理解 slf4j、桥接库、日志记录实现等。我的应用程序依赖于使用 logback 进行日志记录实现的 slf4j。此外,它还引入了一个包含 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 时,任何通过JCL 记录器进行的记录都会被slf4j 拾取并重定向到logback。

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

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

【问题讨论】:

    标签: java logging slf4j


    【解决方案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 实现。

    【讨论】:

    • 我想我仍然缺少一些东西,所以让我问一个后续问题:无论我是否排除重复的 JCL 外观,我都看不到我的应用程序有任何功能差异。我应该仅仅因为不需要它就删除它吗?如果你愿意,这是一个家政问题吗?还是不排除它会产生功能性后果?此外,当我包含jcl-overslf4j 时,我不需要配置两个活动的日志记录实现——只需要 slf4j 委托的那个。那么排除 JCL 后我得到了什么?
    • @JAG commons-loggingjcl-over-slf4j 是两个不同的 jar 文件,包含同名的类,它们的行为不同。那么,当您打电话时,您的应用程序将使用哪一个,例如warning()? 未知!!! --- 它们之间存在冲突,您应该解决它以防止出现无法解释的行为。由于您的应用程序想要 jcl-over-slf4j,因此您需要排除对commons-logging 的任何传递依赖。 --- jcl-over-slf4j 专门设计 来替代commons-logging
    • 啊,好吧,这终于有道理了。这不是 log4j 的情况吗?我假设log4j-over-slf4j 库与log4j jar 具有相同的类名,但它只是委托给 slf4j 而不是记录。如果我使用log4j-over-slf4j,是否需要从依赖它的任何库中排除log4j?是否不存在与 JCL 相同的冲突?
    • @JAG 没错。如果包含log4j-over-slf4j,则必须排除对log4j 的传递依赖。请注意此潜在问题:Using log4j2 with slf4j.
    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多