docker-compose logs 命令如何实现只读取新增量的日志?

我本来运行 docker-compose 来观察日志是通过👇下面的方式来实现的

nohup docker-compose up > run.log &

然后在终端中使用 tail -f 持续观察日志的输出:

tail -f run.log

虽然上面的命令工作良好,但是这样的方式不够优雅,通过阅读 docker-compose 文档,我发现下面的内容:

docker-compose logs

(ideaboom) ╭─bot@amd-5700G ~/Desktop/ideaboom/test_docker  ‹master*› 
╰─➤  docker-compose logs --help      
View output from containers.

Usage: logs [options] [--] [SERVICE...]

Options:
    --no-color          Produce monochrome output.
    -f, --follow        Follow log output.
    -t, --timestamps    Show timestamps.
    --tail="all"        Number of lines to show from the end of the logs
                        for each container.

看起来和 Linux 的 tail 很像,所以我把我的 docker-compose.yml 配置为了下面的样子:

version: "3"
services:
  docker_log_service:
    container_name: docker_log_service
    image: testing/docker_log
    network_mode: "host"
    env_file:
      - .env
    logging:
      driver: json-file
      options:
        max-size: "200k"
        max-file: "10"
    command: python main.py

下面是 Dockerfile

FROM python:3.9.9-slim
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY main.py /code/
RUN pip install loguru pydantic -i https://mirrors.aliyun.com/pypi/simple

下面是 python 的 main.py 文件内容

import time
from loguru import logger


while True:
    logger.debug(f'{time.time()}')
    logger.debug(f'中文测试')
    time.sleep(1)

构建镜像的命令:

sudo docker build -t "testing/docker_log" .

再用下面的命令运行容器服务:

docker-compose up -d

再用下面的命令查看容器服务的日志输出:

docker-compose logs -f

输出如下

(ideaboom) ╭─bot@amd-5700G ~/Desktop/ideaboom/test_docker  ‹master*›
╰─➤  docker-compose logs -f                                                                                                                                                                           130 ↵
Attaching to docker_log_service
docker_log_service    | 2021-12-19 06:30:28.503 | DEBUG    | __main__:<module>:31 - 1639895428.503394
docker_log_service    | 2021-12-19 06:30:28.503 | DEBUG    | __main__:<module>:32 - 中文测试
docker_log_service    | 2021-12-19 06:30:29.505 | DEBUG    | __main__:<module>:31 - 1639895429.5050511
docker_log_service    | 2021-12-19 06:30:29.505 | DEBUG    | __main__:<module>:32 - 中文测试
docker_log_service    | 2021-12-19 06:30:30.507 | DEBUG    | __main__:<module>:31 - 1639895430.5074062
docker_log_service    | 2021-12-19 06:30:30.507 | DEBUG    | __main__:<module>:32 - 中文测试
docker_log_service    | 2021-12-19 06:30:31.509 | DEBUG    | __main__:<module>:31 - 1639895431.5091336
docker_log_service    | 2021-12-19 06:30:31.509 | DEBUG    | __main__:<module>:32 - 中文测试
docker_log_service    | 2021-12-19 06:30:32.510 | DEBUG    | __main__:<module>:31 - 1639895432.510944
docker_log_service    | 2021-12-19 06:30:32.511 | DEBUG    | __main__:<module>:32 - 中文测试
docker_log_service    | 2021-12-19 06:30:33.512 | DEBUG    | __main__:<module>:31 - 1639895433.5128994
docker_log_service    | 2021-12-19 06:30:33.513 | DEBUG    | __main__:<module>:32 - 中文测试
docker_log_service    | 2021-12-19 06:30:34.514 | DEBUG    | __main__:<module>:31 - 1639895434.5148842
docker_log_service    | 2021-12-19 06:30:34.515 | DEBUG    | __main__:<module>:32 - 中文测试
docker_log_service    | 2021-12-19 06:30:35.516 | DEBUG    | __main__:<module>:31 - 1639895435.5168786
docker_log_service    | 2021-12-19 06:30:35.517 | DEBUG    | __main__:<module>:32 - 中文测试
docker_log_service    | 2021-12-19 06:30:36.518 | DEBUG    | __main__:<module>:31 - 1639895436.5186315
docker_log_service    | 2021-12-19 06:30:36.519 | DEBUG    | __main__:<module>:32 - 中文测试
docker_log_service    | 2021-12-19 06:30:37.520 | DEBUG    | __main__:<module>:31 - 1639895437.5202699

一切看起来都正常,但是,当我再次运行 docker-compose logs -f 命令的时候,居然发现又被一切所有的旧日志都打印出来了,而不是只包含 "运行 docker-compose logs 命令" 之后的新日志!!!

我希望运行 docker-compose logs -f 命令只打印新的日志,而不是把老的日志都打印出来!!!

如果这个日志文件已经有 1TB,那不知道有等候到何年马月了!!!

使用 Linux 的 tail -f 命令会打印一点旧日志,当也就几行,无伤大雅,但是这个 docker-compose logs -f 居然是打印一切,真是不可思议!!!!

所以如何做到:运行 docker-compose logs -f 命令只打印新的日志

或者有什么其他的命令可以实现这一点?

阅读 4.9k
2 个回答

加上 tail 参数,从后面开始打印 docker-compose logs --tail=200 -f

除了用 tail 参数,还可以用 since 指定一个开始时间。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题