java - 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 上工作?因为我有一个特定问题需要与链接问题中提出的解决方案不同的解决方案。这个问题需要单独讨论。如果您不明白发生了什么,请停止胡说八道!
解决方案
该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 等等的情况,无止境。
推荐阅读
- python - Python:计算列表/数据框列表中列表/数据框的唯一实例
- vba - 女士访问 VBA 选择案例
- powershell - 无法使用powershell删除某些文件夹
- javascript - 无法使用其属性获取 xml 元素的内部 HTML
- c++ - 返回最长公共子串函数 c++
- android - ImageView 相对于屏幕居中(忽略状态栏和导航栏)
- ios - 由于后台获取,电池状态和电量?
- rest - 如何定义我的 REST API?
- docker - 为外部开发人员设置测试环境
- ithit-webdav-server - IT Hit WebDAV Lib 可以在同一个项目中与 ASP.NET Web API 2 一起使用吗?