Java 在具有许多可传递依赖项的应用程序中实现SLF4J
我正在重构一个具有相当多依赖项的JavaWeb应用程序。我想使用Java 在具有许多可传递依赖项的应用程序中实现SLF4J,java,logging,log4j2,slf4j,Java,Logging,Log4j2,Slf4j,我正在重构一个具有相当多依赖项的JavaWeb应用程序。我想使用slf4j,将log4j2作为底层日志实现。但是,该应用程序包含一些Spring依赖项。Spring使用JCL(Jakarta common logging)进行日志记录,因此它引入了commons日志记录,作为一个可传递的依赖项。这是一个潜在的问题,因为这意味着slf4j可能会使用jcl作为日志实现,而Spring可能会以不希望的方式在某个地方进行日志记录 从中,解决方案是首先通过将其从POM中排除来关闭commons日志记录,然
slf4j
,将log4j2
作为底层日志实现。但是,该应用程序包含一些Spring依赖项。Spring使用JCL(Jakarta common logging)进行日志记录,因此它引入了commons日志记录
,作为一个可传递的依赖项。这是一个潜在的问题,因为这意味着slf4j
可能会使用jcl
作为日志实现,而Spring可能会以不希望的方式在某个地方进行日志记录
从中,解决方案是首先通过将其从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>
然而,正如所讨论的,这种方法仍然意味着其他日志框架将在测试期间出现。此外,我不清楚提供的选项是否适用于所有版本的commons logging
,或者每个版本是否需要特定的条目。如果是后一种情况,那么这就像手动排除commons日志一样单调乏味
排除不需要的日志依赖项以在Java应用程序中配置slf4j
的最佳实践是什么?Commons日志不是slf4j实现。只需将其保留在类路径上,并包含Log4J Jcl,即可将所有公用日志调用路由到Log4J。“很快就清楚,手动排除所有不需要的日志依赖项不会很好地扩展。”-这真的是个问题吗?你不能使用依赖关系树来找到添加排除的位置并使用一些脚本来添加这些吗?@SpaceTrucker这是一个非常棘手的问题…排除每次事件后,依赖关系树都会发生变化,因此你心目中的脚本可能非常重要。与你的问题相关,但是,解决依赖性问题比解决依赖性问题更值得思考:关于依赖性问题,《maven用户指南》建议“当构建失败时,您需要在实施者发现的每个路径上添加特定的排除项。”我希望这意味着它会告诉你包括不需要的依赖项在内的所有内容,这样你就可以一次添加所有排除项。但这并不能完全解决我的问题,因为JCL如果单独使用,可能会继续自己登录。我正在寻找一个通用的解决方案,通过slf4j管道传输所有现有的日志功能。为什么?您的目标应该是让所有日志记录都转到所需的日志记录实现。使用Log4J,您可以使用log4jcl来实现这一点。您可以用slf4j的commons logging jar替换commons logging jar,但这只会通过让commons logging调用通过slf4j传递到Log4J来添加一个额外的层,那么为什么要这样做呢?
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<scope>provided</scope>
</dependency>