我正在尝试一起使用slf4j和log4j。经过一些谷歌搜索,我找到了一些解决方案:
与slf4j和log4j相关的各种名称和版本的罐子让我非常困惑。 slf4j-log4j12,log4j,log4j-core,log4j-over-slf4j,log4j-slf4j-impl,log4j-api,slf4j-impl,log4j12-api,log4j-to-slf4j ......我甚至不能知道这些不同罐子的功能。
那么,我应该选择哪种组合和版本?
答案 0 :(得分:5)
使用SLF4J的标准方法是它是您使用的主要日志框架。 (您调用slf4j-api
中定义的方法。)反过来,它使用“binding”,例如slf4j-log4j12
,告诉它如何与“真实”日志框架进行对话。然后你还需要在类路径上有真正的日志记录框架,例如“log4j”1.2版。
一些较新的日志记录库,例如Logback,都是“绑定”和“真正的”框架,因此如果您想将其用作日志框架,那么需要logback-classic
和slf4j-api
,所以它是两个库而不是三个。
令人困惑的“over”和“to”库作为一种处理现实的方式,你可能依赖于想要以不同于你的应用程序选择的方式登录的库,但这很好将所有内容都指向一个框架。所以,如果您正在使用SLF4J和Logback,但是您依赖于使用Log4j 1.2进行日志记录的库,您希望包含log4j-over-slf4j
library,它将“拦截”应用程序中任何库中的任何Log4j调用并将它们翻译为由SLF4J记录。相反,如果您直接使用Log4j 1.2(没有SLF4J)并且需要调用使用SLF4J的库,那么您将需要包含slf4j-log4j12
库以拦截这些调用并将它们转换为Log4j您。有各种各样的库,每个库都可以拦截并从一个特定的日志框架转换到另一个。
但你的问题是“那么,我应该选择哪种组合和版本?”,这是相当广泛的,因为我们不确定你要做的是什么。选择日志框架就像任何其他技术框架决策一样,基于很多东西,比如开发人员的熟悉程度,你需要集成的系统正在使用什么,以及是否有任何想要与之保持一致的现有代码或标准。因此,我将尽量避免过多地进入选择过程,并回答有关如何设置Maven以使用SLF4J作为日志框架的问题,由Log4j version 2支持:
为Log4j 2及其SLF4J绑定添加依赖项(来自https://logging.apache.org/log4j/2.x/maven-artifacts.html):
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.6.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.6.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.6.1</version> </dependency> </dependencies>
<dependencyManagement>
部分确保所有依赖项都使用相同版本的日志记录框架。 (例如,许多库将包含slf4j-api
作为依赖项,但它们可能各自使用不同的版本。)通常,日志记录框架在版本之间保持良好的兼容性,因此您通常希望覆盖所有提供的依赖版本(通常更新的)你正在使用的那个。jcl-over-slf4j
。bannedDependencies
规则确保您排除任何您未使用的日志框架,而您所依赖的库正试图将项目。也就是说,对于该示例,我提供了一个使用commons-logging
的依赖库,您需要从该库依赖项中<exclude>
commons-logging
,并将其添加到bannedDependencies
列表,以确保您不会意外地从其他库中获取它。否则,您将在类路径上同时拥有“真正的”公共记录以及伪桥(模拟接口并转换为您的真实日志框架),并且会遇到麻烦。我希望概述有所帮助。注意我还没有尝试在任何东西中运行Log4j 2,只是从他们的文档中获得了这些依赖项。绝对测试一切都按照你期望的方式工作。