尾部码头记录查看最近的记录,不是全部

如果您在 Linux 中使用 Coreutils tail 命令,您可以使用-f 选项从日志的当前位置跟踪日志文件(它不会到达文件的最开始并显示所有内容)。

这个功能在 docker 日志中是否可用,而不需要等待它遍历整个日志?

我试过了:

docker logs --since 1m somecontainer

还有

docker logs -f --since 1m somecontainer

看起来它实际上遍历了整个日志文件(这可能需要很长时间) ,然后一旦到达您指定的时间框架就开始回显到屏幕上。

有没有一种不用等待就可以从现在开始跟踪的方法? 我的最佳选择是否总是登出到某个外部文件并使用 Coreutils tail 命令对其进行跟踪?

164116 次浏览

我认为你做得很正确,而且当我尝试的时候,它似乎像预期的那样工作。您是否使用了一些非默认的日志驱动程序等?

要只跟踪新的日志文件,可以使用 -f --since 0m

日志驱动程序的默认设置是 json 文件格式,我能想到的唯一可靠解析方法是从一开始就解析文件,我怀疑 docker 正是这样做的。所以我不确定是否有一个选项可以完全按照你的要求去做。但是,在使用默认的 json 日志驱动程序启动容器时,可以调整两个日志选项。

  1. Max-size: 这限制了单个 json 日志文件的大小。在此之后,docker 将创建一个新文件。默认情况下它是无限的(-1)。
  2. Max-file: 这限制了创建的 json 日志文件的数量,最大值为上面设置的最大值。默认情况下,它设置为1。

你可以在这里阅读这些选项: https://docs.docker.com/config/containers/logging/json-file/

我通常在/etc/docker/daemon.json 文件中使用以下代码行为在 docker 主机上运行的所有容器设置这些选项的新默认值:

{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}

这两个选项要求最多保存3个不同的10meg json 日志文件。结果是每个容器的日志限制在20-30兆之间。您需要在 dockerd 进程上触发一个重新加载来加载这个文件(killall -HUP dockerdsystemctl reload docker)。

您可以通过在 run 命令(或撰写文件内部)上传递 log 选项,在单独的容器上覆盖此选项:

docker container run --log-opt max-size=5m --log-opt max-file=2 ...

似乎没有办法更改现有容器的日志记录选项,因此需要重新创建容器以应用这些更改。

最终的结果是,docker 可能仍然需要解析整个文件来显示最新的日志,但是自动旋转日志的文件将比默认的无限制日志选项小得多。

请阅读 docker logs --help以获得帮助。尝试从下面最后10行开始。更多详细信息 给你

docker logs -f --tail 10 container_name

或者,我们可以按时间检查日志(例如最后2分钟) :

docker logs --since=2m <container_id> // since last 2 minutes
docker logs --since=1h <container_id> // since last 1 hour

使用 尾巴开关:

>  docker logs -f <container name> --tail 10

这将显示从最后10行开始的日志

请阅读 Docker 日志——有关帮助的帮助,但它将有助于检查当前的日志。

Docker log-f Container _ name/id

如果希望基于服务名(docker-compose 的情况)获取日志,可以使用以下简写(Nginx是一个服务名的示例) :

docker logs -f --since=1m $(docker ps -f name=nginx --quiet)