使用log4j-1.2.13等依赖在Java11+Tomcat9环境出现报错如何解决?
问题排查与解决方案
错误1:java.lang.NoSuchMethodError: org.apache.log4j.spi.LoggingEvent.getTimestamp()J
排查思路
- 该方法是log4j 1.2.14版本才新增的API,你当前使用的log4j 1.2.13版本原生不包含该方法,优先排查依赖冲突问题:
- 导出项目依赖树,确认是否有其他组件依赖了更高版本的log4j 1.x,或者引入了
log4j-over-slf4j等桥接包,新旧类混合加载导致方法找不到 - 检查Tomcat 9的lib目录下是否存在其他版本的log4j 1.x包,和应用WEB-INF/lib下的包产生跨应用加载冲突
- 导出项目依赖树,确认是否有其他组件依赖了更高版本的log4j 1.x,或者引入了
解决方法
- 方案一:升级log4j 1.x到最终稳定版
1.2.17,直接兼容新增的getTimestamp()方法 - 方案二:如果使用slf4j作为统一日志门面,移除原生log4j 1.2.13依赖,引入对应版本的
log4j-over-slf4j桥接包,将log4j 1.x的日志调用路由到slf4j层统一处理
错误2:无法调用org.apache.logging.log4j.core.async.AsyncLoggerConfig类中对应AsyncLogger元素的工厂方法,报错java.lang.NoClassDefFoundError : com/lmax/disruptor/EventFactory、java.lang.reflect.InvocationException
排查思路
- 该报错属于log4j 2.x体系的错误,说明你的项目中被其他依赖间接引入了log4j 2.x相关包,且配置了log4j 2.x的异步日志规则:
- 导出项目依赖树,找到引入的
log4j-api、log4j-core等log4j 2.x相关依赖 - 检查类路径下是否存在log4j2.xml、log4j2.json等log4j 2.x配置文件,确认是否配置了AsyncLogger异步日志相关配置
- log4j 2.x的异步日志功能强依赖disruptor组件,未引入该依赖就会触发类找不到报错
- 导出项目依赖树,找到引入的
解决方法
- 方案一:如果需要保留log4j 2.x异步日志能力,引入和当前log4j 2.x版本匹配的disruptor依赖即可,常规log4j 2.x版本适配disruptor 3.x及以上稳定版即可
- 方案二:如果不需要使用log4j 2.x,排除所有间接引入的log4j 2.x相关依赖,同时删除类路径下的log4j 2.x配置文件,避免多日志实现冲突
额外提示:你当前引入的
slf4j-nop是slf4j的无操作实现,会丢弃所有slf4j层面的日志输出,如果你需要正常输出日志,建议替换为slf4j-log4j12(适配log4j 1.x)或者对应log4j 2.x的slf4j适配包。
内容的提问来源于stack exchange,提问作者Sharadha
相关产品推荐
相关产品推荐

