首页 > 解决方案 > log4j-to-slf4j 没有实现 org.apache.logging.log4j.LogManager

问题描述

在我的项目中,我使用 slf4j,

该项目包括一个使用org.apache.logging.log4j:log4j-api:2.14.0

因此,图书馆通过org.apache.logging.log4j.LogManager.getLogger(abc.class)

我包括log4j-to-slf4j-2.x在我的项目中。但是,查看 log4j-to-slf4j-2.x 的内容显示该类没有实现。

我的项目自然会在运行时死掉NoClassDefFound org/apache/logging/log4j/LogManager

我错过了什么?

这不是重复的是否有用于 log4j2 的适配器在 slf4j 上工作?因为我有一个特定问题需要与链接问题中提出的解决方案不同的解决方案。这个问题需要单独讨论。如果您不明白发生了什么,请停止胡说八道!

标签: javalogginglog4jlog4j2slf4j

解决方案


log4j-to-slf4j库适用于您(或库)使用 Log4J 调用logger.error()等的情况,但实际上有一个 SLF4J 实现,例如实际处理日志记录的 Logback(例如,您已经配置了附加程序等logback.xml)。

您需要继续使用 Log4J 库,这是LogManager类存在的地方,但log4j-to-slf4j它会成为一个附加层,它将日志记录路由到 SLF4J 及其实现(例如 Logback)。

在此处输入图像描述

一些注意事项和注意事项:

使用此适配器可能会导致一些性能损失,因为 Log4j 2 消息必须先格式化,然后才能传递给 SLF4J。使用 Log4j 2 作为实现,这些通常只有在被过滤器或附加器访问时才会被格式化。

因此,您将log4j-to-slf4j在使用 Log4J 的代码(例如库)需要集成到使用 SLF4J 进行日志记录的更大代码库的情况下使用,或者一个代码库使用“原始”日志记录(直接访问LogManager)而其他使用的类似情况SLF4J,你不能轻易修改代码。

切勿尝试将SLF4J 适配器 ( log4j-to-slf4j-2.x.jar) 与 SLF4J 桥 () 一起使用,因为它会导致事件在 SLF4J 和 Log4j 2 之间无休止地路由。log4j-slf4j-impl-2.x.jar

因此,由于 Log4J 是 SLF4J 实现,因此可以创建程序将使用 Log4J 记录、桥接到 SLF4J、将桥接到 SLF4J 实现(Log4J)......这将再次桥接到 SLF4J 等等的情况,无止境。


推荐阅读