Log4j从1.8.2升级到2.17.1后日志打印错误时间戳问题
Log4j 2.17.1升级后日志时间显示异常排查与解决
问题背景
Log4j从1.8.2升级到2.17.1后,日志输出的时间与服务器实际时间严重不符,例如日志显示12-31 07:00:00,但服务器实际时间为12-04 00:34。当前log4j2配置中的时间格式段为:
<Pattern>[%d{MM-dd hh:mm:ss,SSS}:%p %F] %m%n</Pattern>
排查与解决步骤
1. 显式指定日志时区
Log4j 2.x默认使用JVM时区,若未明确指定,可能因时区偏移导致时间显示异常。可通过两种方式配置时区:
- 修改PatternLayout时间格式(以GMT+8时区为例):
注:将<PatternLayout> <Pattern>[%d{MM-dd HH:mm:ss,SSS}{GMT+8}:%p %F] %m%n</Pattern> </PatternLayout>hh改为HH(24小时制),避免12小时制带来的时间显示混淆。 - 全局配置时区:在log4j2根
<Configuration>节点添加时区属性:<Configuration status="WARN" timezone="GMT+8"> <!-- 其余配置内容 --> </Configuration>
2. 校验JVM与服务器时间一致性
- 执行服务器系统命令
date查看系统时间; - 在应用中添加代码打印JVM时间与时区:
若JVM时间与系统时间不一致,通过JVM启动参数强制指定时区:System.out.println("JVM当前时间:" + new java.util.Date()); System.out.println("JVM时区:" + java.util.TimeZone.getDefault().getID());-Duser.timezone=GMT+8
3. 排查异步日志配置问题
若使用了AsyncLogger异步日志,升级后可能存在线程池时间初始化异常。临时禁用异步日志测试:
- 移除JVM启动参数中的
log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector; - 修改日志配置,将
AsyncLogger替换为Logger。
若时间恢复正常,说明异步日志配置存在问题,需重新调整AsyncLogger的线程池参数,确保时区正确初始化。
4. 清理Log4j依赖冲突
升级后若残留Log4j 1.x的依赖,可能导致混合加载引发异常:
- Maven项目执行
mvn dependency:tree检查依赖,排除所有log4j 1.x相关依赖; - Web项目检查
WEB-INF/lib目录,删除log4j-1.8.2.jar等旧版本jar包,确保仅保留log4j-core、log4j-api等2.x版本依赖。
验证方法
修改配置后重启服务器,观察新生成的日志,确认时间与服务器实际时间一致即可。
内容的提问来源于stack exchange,提问作者Anuha
相关产品推荐
相关产品推荐

