【问题标题】:Set timestamp of container to apply in docker logs设置容器的时间戳以应用于 docker 日志
【发布时间】:2021-12-24 13:54:46
【问题描述】:

我想查看带有时间戳的容器日志,但日志的时区不是从 ENV 设置的

version: '3.8'
services:
  api:
    build: .
    ports:
      - "3000:3000"
    environment:
      - TZ=Asia/Tehran

但是在使用docker-compose up -build 构建容器并运行以下命令查看容器日志后,我发现Asia/Tehran 的时间戳设置不正确:

docker-compose logs -ft api

【问题讨论】:

  • 日志中的时间戳是由 Docker 守护进程输出的,而不是容器。所以你不能通过在容器中设置 TZ 来改变它。我不知道是否可以更改守护程序。它似乎默认以 UTC 输出。
  • @gohm'c 我已经尝试过该解决方案,但没有成功。

标签: docker docker-compose


【解决方案1】:

我不相信这是可能的。当您运行 docker logs -tdocker-compose logs -t 时,日志中时间戳的输出来自 docker 客户端,该客户端正在转发来自 docker 引擎的日志。看着code for including the timestamp

        if config.Timestamps {
            logLine = append([]byte(msg.Timestamp.Format(jsonmessage.RFC3339NanoFixed)+" "), logLine...)
        }

msg.Timestamp 字段不会通过 time.Local() 传递,因此无论运行 docker 引擎的主机的时区还是调用 docker API 的客户端的时区,它都应始终被视为 UTC。

容器的时区在此处不适用,除非您将时间戳添加到应用程序本身的日志中并跳过传递 -t 选项。

【讨论】:

    【解决方案2】:

    您使用的基本图像很重要。这是一个开箱即用的快速示例:

    docker run --init -d --rm -e TZ=Asia/Tehran centos bash -c 'while true; do echo "$(date) INFO log message."; sleep 1; done'
    docker logs -f <container>  # you will see the log date time uses container's TZ instead of the host
    

    您可以将 TZ 更改为不同的时区以查看不同的日志日期时间。如果您在日志命令中包含“-t”,您将在日志消息中看到主机日期/时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2014-04-26
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      相关资源
      最近更新 更多