在 Ubuntu 上 Tomcat 日志时间不对,一般不是系统时间错了,而是 时区 / JVM 时区 / 日志格式 的问题。下面按“最常见 → 次常见”的顺序给你一套排查和解决方法。
date
timedatectl
如果系统时间就不对:
# 设置时区(比如中国)
sudo timedatectl set-timezone Asia/Shanghai
# 同步时间
sudo apt install ntpdate
sudo ntpdate ntp.aliyun.com
✅ 系统时间对了,再看 Tomcat。
Tomcat 用的是 JVM 的时区,不是系统时间直接显示的。
java -XshowSettings:all -version 2>&1 | grep Timezone
如果你看到:
user.timezone = UTC
那日志时间大概率会快/慢 8 小时。
catalina.sh编辑:
sudo vim /opt/tomcat/bin/catalina.sh
在 # OS specific support 上面加:
export JAVA_OPTS="$JAVA_OPTS -Duser.timezone=Asia/Shanghai"
然后重启 Tomcat:
sudo systemctl restart tomcat
# 或
/opt/tomcat/bin/shutdown.sh
/opt/tomcat/bin/startup.sh
✅ 推荐这种做法,最稳。
setenv.sh(更规范)sudo vim /opt/tomcat/bin/setenv.sh
内容:
export JAVA_OPTS="$JAVA_OPTS -Duser.timezone=Asia/Shanghai"
没有这个文件就新建一个,记得加执行权限:
chmod +x /opt/tomcat/bin/setenv.sh
有些 Ubuntu 环境中:
echo $TZ
如果有问题,可以取消:
unset TZ
或者在 Tomcat 启动前明确指定:
export TZ=Asia/Shanghai
logging.properties 里的时间格式Tomcat 默认用的是 java.util.logging,时间来自 JVM。
如果你用了 log4j / logback,那看配置:
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger - %msg%n</pattern>
确保没有写:
%d{yyyy-MM-dd HH:mm:ss, UTC}
如果你是在 Docker 里跑 Tomcat:
docker run -e TZ=Asia/Shanghai ...
或在 Dockerfile:
ENV TZ=Asia/Shanghai
| 检查项 | 命令 |
|---|---|
| 系统时间 | date |
| 系统时区 | timedatectl |
| JVM 时区 | java -XshowSettings:all -version |
| Tomcat 日志 | tail -f logs/catalina.out |
Tomcat 日志时间 ≠ 系统时间,而是 JVM 时区决定的。
解决方式:给 Tomcat 的 JVM 加上-Duser.timezone=Asia/Shanghai。
如果你愿意,可以把下面信息贴出来,我可以直接帮你定位:
date 输出java -version我可以帮你精确到“一行改哪个文件”。