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



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

从slf4j文档中,解决方案是首先通过将其从POM中排除来关闭commons-logging,然后使用jcl-over-slf4j替换commons-logging。 当然,jcl-over-slf4j会将 Spring 之前进行的所有日志记录调用路由到slf4j

我尝试排除commons-logging,例如

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

但是,在检查Maven依赖树时,commons-logging现在仍然显示为json-lib的依赖关系,这是该项目具有的另一个依赖关系。

很明显,手动排除所有不需要的日志记录依赖项不会很好地扩展。slf4j文档继续建议使用作为选项提供的范围:

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

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

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

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

最新更新