我正在研究的项目正在使用几个开源框架。每个框架都使用一些日志库。我的问题是最终交付物包含 log4j(在两个不同版本中)、带有 logback 的 slf4j,当然还有常见的日志记录。我正在寻找如何减少库数量的解决方案,我可以在 maven 的 pom 文件中排除日志库并将 slf4j 配置为“拦截”日志消息吗?
3 回答
Slf4j 在其手册中有一些关于如何做到这一点的信息。
我认为您正在寻找的是从您的所有 Maven 依赖项中排除并加载log4j
包。它们旨在替换and并且包含适当的和类来替换, , 和朋友。这不会减少库,但会将所有日志输出通过. 除非您摆脱对这些类的使用(显然),否则您无法减少对包装器或原始类的依赖。commons-logging
log4j-over-slf4j
jcl-over-slf4j
log4j
commons-logging
org.apache.log4j
org.apache.commons.logging
Logger
Log
sl4fj
slf4j
如果您希望使用一个日志记录包,那么正确的方法可能是切换到使用commons-logging
被设计为日志记录委托器的包,然后使用slf4j-jcl
挂钩到commons-logging
.
对于后代,您可以通过这种方式为每个需要的依赖项排除依赖项log4j
。
<dependency>
<groupId>.../groupId>
<artifactId>...</artifactId>
<version>...</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
编辑更仔细地阅读您的问题。slf4j 为非 slf4j 项目添加了一个遗留桥梁。但是您仍然需要在运行时路径上提供依赖的 jar。这只是不重复别人工作的代价。
我的意思是考虑一下,您拥有所有那些本质上需要在 jvm 中链接的完全限定符号。一些简单的伏都教可以让你到处走走,包括依赖库。
看看pax-logging。它引入了几乎所有你能想到的日志框架接口(正确的包名和类等),但它没有实现它们。相反,它将这些外观链接到 log4j 后端。
换句话说,您的项目继续使用它们原来的日志框架,但这些(透明地)移交给了 log4j。这样你的日志输出是一致的,并且只在一个地方配置。