我正在尝试同时使用slf4j和log4j。经过一番谷歌搜索,我找到了一些解决方案:
与slf4j和log4j相关的jar的各种名称和版本让我非常困惑。 slf4j-log4j12,log4j,log4j-core,log4j-over-slf4j,log4j-slf4j-impl,log4j-api,slf4j-impl,log4j12-api,log4j-to-slf4j ............我什至无法了解这些不同罐子的功能。
那么,我应该选择哪种组合和版本?
最佳答案
使用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支持)的问题:
<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,只是从他们的文档中获得了这些依赖项。绝对测试一切是否按您期望的方式工作。
关于maven - 如何将log4j + slf4j添加到pom.xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38031194/