【问题标题】:How can I add log4j + slf4j to pom.xml?如何将 log4j + slf4j 添加到 pom.xml?
【发布时间】:2016-10-28 02:58:17
【问题描述】:

我正在尝试同时使用 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?

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

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

【问题讨论】:

  • #3 看起来像您正在寻找的答案:您需要 API (slf4j-api-VERSION.jar) 和与您要使用的日志记录框架匹配的 jar (slf4j-log4j12-VERSION 。罐)。最佳答案应该是slf4j.org/manual.html
  • 你到底想要什么?带有 slf4j 实现的 log4j api 或带有 log4j 实现的(最常见的)slf4j-api

标签: maven logging log4j slf4j


【解决方案1】:

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

一些较新的日志库,例如Logback,既是“绑定”“真正的”框架,所以如果你想使用它作为你的日志框架,你只需要@ 987654333@ 和 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 支持:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2011-07-13
    • 2014-10-31
    • 1970-01-01
    • 2010-11-25
    • 2018-07-10
    • 1970-01-01
    相关资源
    最近更新 更多