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

时间:2016-06-25 17:37:50

标签: maven logging log4j slf4j

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

  1. How does simply adding slf4j to the pom.xml wrap log4j?
  2. https://dzone.com/articles/adding-slf4j-your-maven
  3. How to get SLF4J "Hello World" working with log4j?
  4. 与slf4j和log4j相关的各种名称和版本的罐子让我非常困惑。 slf4j-log4j12,log4j,log4j-core,log4j-over-slf4j,log4j-slf4j-impl,log4j-api,slf4j-impl,log4j12-api,log4j-to-slf4j ......我甚至不能知道这些不同罐子的功能。

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

1 个答案:

答案 0 :(得分:5)

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

一些较新的日志记录库,例如Logback,都是“绑定”“真正的”框架,因此如果您想将其用作日志框架,那么需要logback-classicslf4j-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支持:

  1. 为当前版本的slf4j-api
  2. 添加依赖项
  3. 为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>
    
    1. 使用POM中的<dependencyManagement>部分确保所有依赖项都使用相同版本的日志记录框架。 (例如,许多库将包含slf4j-api作为依赖项,但它们可能各自使用不同的版本。)通常,日志记录框架在版本之间保持良好的兼容性,因此您通常希望覆盖所有提供的依赖版本(通常更新的)你正在使用的那个。
    2. 如果您有任何使用其他日志记录框架的库,请使用适当的拦截器桥来重定向其日志记录,一个from Log4j 2将其直接重定向到Log4Jj 2,或者一个from SLF4J重定向到SLF4J,然后将进一步定向到Log4j。 (虽然它似乎可以重定向两次,但如果您要保留SLF4J但在某些时候更改为另一个“真正的”日志框架,它可能会更容易。也许。)例如,如果您有一个使用commons-logging的库,您想要包含jcl-over-slf4j
    3. 此外,使用maven-enforcer-pluginbannedDependencies规则确保您排除任何您未使用的日志框架,而您所依赖的库正试图将项目。也就是说,对于该示例,我提供了一个使用commons-logging的依赖库,您需要从该库依赖项中<exclude> commons-logging,并将其添加到bannedDependencies列表,以确保您不会意外地从其他库中获取它。否则,您将在类路径上同时拥有“真正的”公共记录以及伪桥(模拟接口并转换为您的真实日志框架),并且会遇到麻烦。
  4. 我希望概述有所帮助。注意我还没有尝试在任何东西中运行Log4j 2,只是从他们的文档中获得了这些依赖项。绝对测试一切都按照你期望的方式工作。