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

标签 maven logging log4j slf4j

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

  • How does simply adding slf4j to the pom.xml wrap log4j?
  • https://dzone.com/articles/adding-slf4j-your-maven
  • How to get SLF4J "Hello World" working with 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-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支持)的问题:

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

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

    关于maven - 如何将log4j + slf4j添加到pom.xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38031194/

    相关文章:

    java - 与 Logstash 一起使用时在 log4j 上被阻止

    java - Maven 在 `package` 目标期间复制 webapp 资源后如何做?

    java从文件夹加载文件,但项目是一个模块

    java - Maven - 如何使用注释从 src/test/java 内的不同包运行 2 个 java 文件

    logging - 如何使用 log4rs 创建自定义过滤器类型?

    java - 找不到记录器(log4j)的附加程序?

    java - Spring MVC Maven Jar hell : The hierarchy of the type "ExtendedMappingJacksonJsonView" is inconsistent

    asp.net-mvc - 我可以在 ASP.NET MVC 5(非 mvc 核心)项目中使用 ILoggerFactory 吗?

    logging - Docker 组合不显示链接的控制台输出

    java - JBoss AS 7.1.1 Final 和 Log4j + 不工作