【问题标题】:Is there an adapter for log4j2 to work over slf4j?是否有 log4j2 的适配器可以在 slf4j 上工作?
【发布时间】:2017-09-26 20:12:56
【问题描述】:

我有一个使用 log4j2 的第三方库 (elasticsearch 5.x)。我的应用程序使用 slf4j。是否有适用于第 2 版 log4j 的适配器,类似于第 1 版适配器 (log4j-over-slf4j)?

澄清一下:我不想实际使用 log4j 或 log4j2 作为实际实现(绑定)。我为此使用 logback。所以我需要一个 log4j2 到 slf4j 的适配器,而不是一个 slf4j 绑定。

我还应该提到我已经找到并尝试了这个库(在 2.0-beta 版本中): https://logging.apache.org/log4j/2.0/log4j-to-slf4j/index.html 但它给了我这个错误:

Caused by: java.lang.AbstractMethodError: org.apache.logging.slf4j.SLF4JLoggerContextFactory.getContext(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/Object;Z)Lorg/apache/logging/log4j/spi/LoggerContext;
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:175)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:426)
at org.elasticsearch.common.logging.ESLoggerFactory.getLogger(ESLoggerFactory.java:49)
at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:105)
at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:72)
at org.elasticsearch.common.component.AbstractComponent.<init>(AbstractComponent.java:37)
at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:98)
at org.elasticsearch.client.transport.TransportClient.newPluginService(TransportClient.java:99)
at org.elasticsearch.client.transport.TransportClient.buildTemplate(TransportClient.java:124)
at org.elasticsearch.client.transport.TransportClient.<init>(TransportClient.java:258)
at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:125)
at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:111)
at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:101)

编辑:好的..所以我想我昨天只是瞎了眼,我只看到了这个库的测试版。因此答案是有这样的适配器,它就在这里:

https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-to-slf4jhttps://logging.apache.org/log4j/2.0/log4j-to-slf4j/index.html

目前最新版本是2.8.2

【问题讨论】:

  • 当您看到此错误时,请清楚说明您使用的所有相关库的版本。
  • 是的,它是旧版本。我让它与最新的(2.8.2)一起工作。谢谢

标签: java log4j slf4j log4j2


【解决方案1】:

您应该包含 log4j-to-slf4j-2.x.jar 并确保不包含 log4j-slf4j-impl-2.x.jar。详情请见Log4j to SLF4J Adapter

【讨论】:

  • +1 现代 log4j v2 的适当解决方案。 Slf4j 项目不提供桥接。它是由 Apache 项目自己完成的。
【解决方案2】:

Log4j2 本身捆绑了一个slf4j implementation (log4j-slf4j-impl-2.x.jar)

这是 Log4j2 distribution 中的 jar 之一。


问题澄清后更新:

Log4j2 包含一个log4j-to-slf4j bridge“。这是您将 Log4j2 日志记录路由到另一个 slf4j 实现所需要的。

提到的错误可能是版本不兼容的问题,但问题没有提到版本号所以很难说。

【讨论】:

  • 对不起,如果我不干净,但我不想使用 log4j 或 log4j2 作为我的实现(slf4j 绑定)。我为此使用 logback。我只想要一个 log4j2 到 slf4j 适配器。请参阅上面的编辑。
  • 感谢 Remko,我刚刚找到了 log4j-to-slf4j 适配器的正确版本并让它工作。我刚刚发布了我的问题的答案,但是由于我看到您现在也发布了相同的答案,因此我将接受您的答案而不是我的答案。谢谢
【解决方案3】:

来自https://logging.apache.org/log4j/2.0/faq.html

当您的应用程序调用 Log4j 2 API 并且您希望将日志记录调用路由到 SLF4J 实现时,您可以使用 log4j-to-slf4j 适配器 jar。

Slf4j 项目不提供从 log4j v2 到 Slf4j 的桥接(https://www.slf4j.org/legacy.html 中没有提到)。

Maven 依赖:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-to-slf4j</artifactId>
    <version>2.11.0</version>
</dependency>

Gradle 依赖:

compile "org.apache.logging.log4j:log4j-to-slf4j:2.10.0"

注意上面的包有传递依赖:

org.slf4j:slf4j-api:1.7.25
org.apache.logging.log4j:log4j-api:2.10.0

包列表:https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-to-slf4j

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-13
    • 2017-05-18
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多