我正在重构具有大量依赖关系的Java Web应用程序。我想使用slf4j
和log4j2
作为基础日志记录实现。但是,该应用程序包含一些Spring依赖项。 Spring使用JCL(雅加达通用日志记录)进行日志记录,因此它引入commons-logging
作为传递依赖项。这是一个潜在的问题,因为这意味着slf4j
可能会在jcl
上作为日志记录实现,而Spring可能会以不希望的方式记录到某个地方。
从slf4j documentation开始,解决方案是先通过从POM中排除commons-logging
来关闭jcl-over-slf4j
,然后使用commons-logging
替换jcl-over-slf4j
。当然,slf4j
会将Spring之前进行的所有以前的日志记录调用路由到commons-logging
。
我尝试排除<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
,例如
commons-logging
但是,当检查Maven依赖关系树时,json-lib
仍显示为项目slf4j
的依赖,这是项目具有的另一个依赖。
很快就很清楚,手动排除所有不需要的日志记录依赖项将无法很好地扩展。 <dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<scope>provided</scope>
</dependency>
文档继续建议使用作为选项提供的范围:
commons-logging
但是,正如this SO question所讨论的那样,这种方法仍然意味着在测试期间将存在其他日志记录框架。同样,我不清楚此提供的选项是否适用于commons-logging
的所有版本,还是每个版本都需要一个特定的条目。如果是后者,那么这就像在任何地方手动排除slf4j
一样繁琐。
在Java应用程序中排除不需要的日志依赖项以配置publicPath
的最佳实践是什么?
答案 0 :(得分:1)
公用日志记录不是slf4j实现。只需将其保留在类路径上,并包含Log4J-Jcl即可将所有公用日志记录调用路由到Log4J。