代码之家  ›  专栏  ›  技术社区  ›  Tim Biegeleisen

在具有许多可传递依赖项的应用程序中实现slf4j

  •  1
  • Tim Biegeleisen  · 技术社区  · 6 年前

    我正在重构一个Java Web应用程序,它有相当多的依赖项。我想用 slf4j ,与 log4j2 作为底层日志记录实现。但是,应用程序包含一些spring依赖项。spring使用jcl(jakarta common logging)进行日志记录,因此它引入了 commons-logging 作为传递依赖。这是一个潜在的问题,因为它意味着 SLF4J系列 可能会接电话 jcl 作为一个日志实现,这个spring可能以一种不受欢迎的方式在某个地方进行日志记录。

    slf4j documentation ,解决方案是首先关闭 公用日志 把它从pom中排除,然后使用 jcl-over-slf4j 替换 公用日志 是的。当然, JCL-over-SLF4J型 将把spring以前发出的所有日志记录调用路由到 SLF4J系列 是的。

    我试过排除 公用日志 ,例如

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

    但是,在检查maven依赖树时, 公用日志 现在仍然显示为 json-lib ,项目具有的另一个依赖项。

    很快就清楚了,手动排除所有不需要的日志依赖项不会很好地扩展。这个 SLF4J系列 文档还建议使用提供的作用域作为选项:

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

    但是,作为 this SO question 讨论,这种方法仍然意味着其他日志框架将在测试期间出现。另外,我也不清楚这个选项是否适用于 全部的 版本 公用日志 ,或者每个版本都需要特定的条目。如果是后者,那么这就和手动排除一样乏味 公用日志 到处都是。

    排除要配置的不需要的日志依赖项的最佳实践是什么 SLF4J系列 在Java应用程序中?

    0 回复  |  直到 6 年前
        1
  •  1
  •   rgoers    6 年前

    Commons日志记录不是SLF4J实现。只要把它留在类路径上,并包含log4jcl,就可以将所有commons日志记录调用路由到log4j。