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

时间:2019-06-17 14:34:55

标签: java logging log4j2 slf4j

我正在重构具有大量依赖关系的Java Web应用程序。我想使用slf4jlog4j2作为基础日志记录实现。但是,该应用程序包含一些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 的最佳实践是什么?

1 个答案:

答案 0 :(得分:1)

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