You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时间与时区:
    System.out.println("JVM当前时间:" + new java.util.Date());
    System.out.println("JVM时区:" + java.util.TimeZone.getDefault().getID());
    
    若JVM时间与系统时间不一致,通过JVM启动参数强制指定时区:
    -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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:53:28