如何修复Springboot应用日志运行时间与系统时间不一致的问题

问题描述 投票:0回答:1

我有一个在 Tomcat8 上运行的 SprintBoot Web 应用程序。它的三个实例运行在不同的 docker 容器中。

有一天,其中一个应用实例的日志时间从GMT+8变成了GMT,相差了8个小时。并且与时间相关的接口异常。

另外两个实例的时间相关接口和日志时间均为预计北京时间(GMT+8)。

三个实例均使用外部配置中心,其中 spring.jackson.time-zone=GMT+8,所以应该不会出现配置不一致的情况。

我对比了三个实例的相关环境变量,没有发现与时间TZ和时区相关的覆盖配置。

还有其他方法可以定位并解决这个问题吗?期待您的回复

PS:docker容器是centos系统

java spring-boot docker tomcat centos
1个回答
0
投票

该属性仅适用于杰克逊,不适用于系统。所有时间(例如通过

System.currentMillis()
检索的时间)都使用操作系统时区(即容器的时区)。要设置容器的时区,您有三个选项:

1.在
docker run
命令中设置

您可以在运行容器时通过使用

-e
选项传递时区环境变量来设置时区。

示例:

docker run -e TZ=America/New_York <image>

America/New_York
替换为您所需的时区,将
<image>
替换为您的 Docker 映像的名称。

2.在 Dockerfile 中设置

您可以通过配置环境变量并安装时区数据,直接在 Dockerfile 中设置时区。

示例:

FROM ubuntu:latest

# Set the time zone environment variable
ENV TZ=America/New_York

# Install tzdata and set the time zone
RUN apt-get update && \
    apt-get install -y tzdata && \
    ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && \
    dpkg-reconfigure --frontend noninteractive tzdata

此 Dockerfile 在 Docker 映像的构建过程中将时区设置为

America/New_York

3.将主机操作系统
/etc/timezone
挂载到容器

您可以将主机的时区配置文件挂载到容器中,以确保容器与主机使用相同的时区。

示例:

docker run -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro <image>

这会将容器的时区配置与主机的时区链接起来,使它们保持一致。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.