如何将log4j + slf4j添加到pom.xml?

exp*_*ter 3 logging log4j slf4j maven

我正在尝试同时使用slf4j和log4j。经过一番谷歌搜索,我找到了一些解决方案:

  1. 简单地将slf4j添加到pom.xml中如何包装log4j?
  2. https://dzone.com/articles/adding-slf4j-your-maven
  3. 如何使SLF4J“ Hello World”与log4j一起使用?

与slf4j和log4j相关的jar的各种名称和版本让我非常困惑。slf4j-log4j12,log4j,log4j-core,log4j-over-slf4j,log4j-slf4j-impl,log4j-api,slf4j-impl,log4j12-api,log4j-to-slf4j ............我什至无法了解这些不同罐子的功能。

那么,我应该选择哪种组合和版本?

小智 6

使用SLF4J的标准方法是它是您使用的主要日志记录框架。(您调用在中定义的方法slf4j-api。)依次使用“ 绑定 ”,例如slf4j-log4j12告诉它如何与“真实”日志记录框架进行通信。然后,您还需要在类路径上具有真实的日志记录框架,例如“ log4j” 1.2版。

一些较新的日志记录库(例如Logback)既是“绑定” 框架是“真实”框架,因此,如果要将其用作日志记录框架,则只需要logback-classic和一起使用slf4j-api,所以它是两个库,而不是三个。

存在令人困惑的“ over”和“ to”库是一种处理现实的方法,您可能依赖于希望以与为应用程序选择的方式不同的方式登录的库,但是拥有所有功能很不错针对一个框架。因此,如果您使用的是SLF4J和Logback,但您依赖的是使用Log4j 1.2进行日志记录的log4j-over-slf4j,则要包含该,它将“拦截”应用程序中任何库中的所有Log4j调用并将其转换为由SLF4J记录。相反,如果直接使用Log4j 1.2记录(不使用SLF4J),并且需要调用使用SLF4J的库,则需要包含slf4j-log4j12库拦截这些调用,然后为您将其转换为Log4j。这些库种类繁多,每种库都可以从一种特定的日志记录框架进行拦截并将其转换为另一种。

但是您的问题是“那么,我应该选择哪种组合和版本?”,因为我们不确定您要做什么,所以范围很广。选择日志记录框架就像其他任何技术框架决策一样,取决于很多方面,例如开发人员的熟悉程度,需要与之集成的系统正在使用的内容以及是否有想要与之保持一致的现有代码或标准。因此,我将尝试避免过多地进入选择过程,并回答有关如何设置Maven以使用SLF4J作为日志框架(由Log4j版本2支持)的问题:

  1. 为当前版本的slf4j-api添加依赖项
  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>
    
    Run Code Online (Sandbox Code Playgroud)
    1. 使用<dependencyManagement>POM中的部分来确保所有依赖项都使用相同版本的日志记录框架。(例如,许多库将包含slf4j-api为依赖项,但它们可能各自使用不同的版本。)通常,日志记录框架在版本之间保持良好的兼容性,因此,您通常希望用(通常是较新的)提供的依赖项版本覆盖所有提供的依赖项版本。您正在使用。
    2. 如果您有使用其他日志记录框架的任何库,请使用适当的拦截器桥重定向其日志记录,或者从Log4j 2将其直接重定向到Log4Jj 2,或者从SLF4J将其重定向到SLF4J,然后将其重定向。进一步针对Log4j。(尽管它似乎进行了两次重定向,但如果保留SLF4J但在某个时候更改为另一个“真实”日志记录框架,则可能会使事情变得更容易。)例如,如果您有一个使用commons-logging的库,您想改为包含jcl-over-slf4j
    3. 同样,使用maven-enforcer-pluginbannedDependencies规则来确保您排除了不使用的所有日志记录框架,而您所依赖的库正试图将其引入项目中。也就是说,对于该示例,我给出了一个您所依赖的库commons-logging,您需要使用<exclude> commons-logging该库,并将该库依赖项添加到bannedDependencies列表中,以确保您不会意外从其他库中再次获取它。否则,您将在类路径上同时拥有“真实的”公共日志记录和伪造的桥(模拟接口并转换为真实的日志记录框架),并且会遇到麻烦。

希望概述对您有所帮助。注意我实际上还没有尝试过运行Log4j 2,只是从他们的文档中获得了这些依赖项。绝对测试一切都按您期望的方式工作。