我正在重构一个具有相当多依赖项的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
时,排除不需要的日志依赖项的最佳做法是什么?
Commons日志不是slf4j实现。只需将其保留在类路径上,并包括log4jjcl,以将所有公共日志调用路由到Log4J。