提问者:小点点

在具有许多传递依赖关系的应用程序中实现SLF4J


我正在重构一个具有相当多依赖项的JavaWeb应用程序。我想使用slf4j,将log4j2作为底层日志实现。但是,该应用程序包含一些Spring依赖项。Spring使用JCL(Jakarta common logging)进行日志记录,因此它引入了commons日志记录,作为一个可传递的依赖项。这是一个潜在的问题,因为这意味着slf4j可能会使用jcl作为日志实现,而Spring可能会以不希望的方式在某个地方进行日志记录。

根据slf4j文档,解决方案是首先通过将其从POM中排除来关闭commons日志记录,然后使用jcl-over-slf4j替换commons日志记录。当然,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>

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

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


共1个答案

匿名用户

Commons日志不是slf4j实现。只需将其保留在类路径上,并包括log4jjcl,以将所有公共日志调用路由到Log4J。