【问题标题】:Implementing SLF4J in an application with many transitive dependencies在具有许多传递依赖项的应用程序中实现 SLF4J
【发布时间】:2019-10-31 04:15:09
【问题描述】:

我正在重构具有大量依赖项的 Java Web 应用程序。我想使用slf4jlog4j2 作为底层的日志实现。但是,该应用程序包含一些 Spring 依赖项。 Spring 使用 JCL(Jakarta 通用日志记录)进行日志记录,因此它引入了 commons-logging 作为传递依赖项。这是一个潜在的问题,因为这意味着 slf4j 可能会采用 jcl 作为日志记录实现,并且 Spring 可能会以不合需要的方式在某处进行日志记录。

slf4j documentation开始,解决方法是先将commons-logging从POM中排除,然后用jcl-over-slf4j替换commons-logging。当然,jcl-over-slf4j 会将 Spring 之前的所有日志记录调用路由到 slf4j

我已尝试排除commons-logging,例如

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

但是,在检查 Maven 依赖树时,commons-logging 现在仍然显示为 json-lib 的依赖,这是项目的另一个依赖。

很快就清楚,手动排除所有不需要的日志记录依赖项不会很好地扩展。 slf4j 文档继续建议使用作为选项提供的范围:

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <scope>provided</scope>
</dependency>

然而,正如this SO question 所讨论的,这种方法仍然意味着其他日志框架将在测试期间出现。此外,我不清楚这个提供的选项是否适用于commons-logging所有 版本,或者每个版本都需要一个特定的条目。如果是后者,那么这将与手动将commons-logging 排除在任何地方一样乏味。

排除不需要的日志记录依赖项以在 Java 应用程序中配置 slf4j 的最佳做法是什么?

【问题讨论】:

  • “很快就清楚,手动排除所有不需要的日志记录依赖项不会很好地扩展。” - 这真的有问题吗?难道你不能使用依赖树来找到添加排除项并使用一些脚本来添加这些吗?
  • @SpaceTrucker 这是一个非常麻烦的问题...在排除每次出现后依赖关系树都会发生变化,因此您想到的脚本可能相当重要。
  • 与您的问题有关,但比解决您的依赖问题更值得深思:stackoverflow.com/a/41500347/3284624
  • 关于您的依赖问题,maven 用户指南建议使用banned dependencies rule 和“当构建失败时,您需要在执行器找到的每个路径上添加特定的排除项。”我希望这意味着它会告诉您包括不需要的依赖项在内的所有内容,以便您可以一次添加所有排除项。

标签: java logging log4j2 slf4j


【解决方案1】:

Commons 日志记录不是 slf4j 实现。只需将其保留在类路径中并包含 Log4J-Jcl 即可将所有公共日志记录调用路由到 Log4J。

【讨论】:

  • 但这并不能完全解决我的问题,因为如果不理会 JCL,它可能会继续自行登录。我正在寻找通过 slf4j 管道 all 现有日志记录功能的通用解决方案。
  • 为什么?您的目标应该是让所有日志记录都转到所需的日志记录实现。使用 Log4J,您可以使用 Log4J-jcl 来做到这一点。你可以用 slf4j 的 commons logging jar 替换 commons logging jar,但这只会通过让 commons logging 调用通过 slf4j 到 Log4J 添加一个额外的层,那么为什么要这样做呢?
猜你喜欢
  • 2014-04-25
  • 2017-01-20
  • 2011-02-09
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多