Log4j从2.23.0升级到2.23.1后出现异常日志与类缺失问题求助
问题
将Log4j依赖从2.23.0版本升级到2.23.1后,遇到两个问题:
- 额外TRACE日志:出现
Log4j2-TF-3-Scheduled-1 TRACE WatchRunnable run triggered.等日志,即使设置-Dlog4j2.debug=false等Java参数禁用该类日志,回退到2.23.0版本则无此问题; - JndiLookup类缺失错误:日志中出现
org.apache.logging.log4j.core.lookup.JndiLookup类找不到的异常,尽管未使用JNDI查找且已配置{nolookups},回退版本后错误消失。
当前Maven依赖配置:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.23.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.23.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.23.1</version> </dependency>
log4j.xml配置:
<?xml version="1.0" encoding="UTF-8"?> <Configuration strict="true" monitorInterval="30"> <Properties> <Property name="logPattern">%date{ISO8601_OFFSET_DATE_TIME_HHMM} [%-5level] [%logger] %message{nolookups}%n</Property> </Properties> <Appenders> <!-- Simple console logger --> <Console name="CONSOLE" target="SYSTEM_OUT"> <PatternLayout pattern="${logPattern}"/> </Console> <RollingFile name="myAppender" fileName="app.log" filePattern="app-%d{yyyy-MM-dd}-%i.log"> <PatternLayout pattern="${logPattern}"/> <Policies> <OnStartupTriggeringPolicy /> <TimeBasedTriggeringPolicy modulate="true" /> <SizeBasedTriggeringPolicy size="10 MB"/> </Policies> <DefaultRolloverStrategy min="1" max="1"> <Delete maxDepth="1"> <IfFileName glob="app-*.log" /> <IfLastModified age="1d" /> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="myAppender"/> </Root> </Loggers> </Configuration>
请问这两个问题是Log4j的bug,还是需要额外的配置或依赖?
分析与解决方案
1. 额外TRACE日志问题
这不是bug,是Log4j 2.23.1对配置文件监控线程的日志级别调整导致的。WatchRunnable属于org.apache.logging.log4j.core.config包下的类,-Dlog4j2.debug=false控制的是Log4j自身调试日志,和该线程的日志不属于同一控制维度。
解决方法:在log4j.xml的<Loggers>节点下新增日志器,明确关闭该类的TRACE日志:
<Loggers> <!-- 关闭配置监控线程的TRACE日志 --> <Logger name="org.apache.logging.log4j.core.config.WatchRunnable" level="OFF"/> <Root level="INFO"> <AppenderRef ref="myAppender"/> </Root> </Loggers>
2. JndiLookup类缺失问题
这是Log4j版本变更导致的:从2.17.0版本开始,JndiLookup类被从log4j-core中移除,单独拆分到log4j-core-jndi依赖包中。即使配置了{nolookups},Log4j启动时仍会尝试加载所有默认Lookup实现类,找不到则抛出异常。
解决方法有两种:
- 若完全不需要JNDI功能,直接添加JVM参数
-Dlog4j2.formatMsgNoLookups=true,彻底禁用所有Lookup功能,避免Log4j尝试加载JndiLookup类; - 若确实需要JNDI功能,可添加对应版本的
log4j-core-jndi依赖,但不推荐无需求时添加。
内容的提问来源于stack exchange,提问作者bcoveny
相关产品推荐
相关产品推荐

