如何从日志中的当前位置拖尾Docker日志而不看到整个文件或等待它遍历整个文件

时间:2018-08-31 16:56:01

标签: docker logging

如果在Linux中使用coreutils tail命令,则具有-f选项,该选项可让您从日志的当前位置开始跟踪日志文件(它不会移至文件的开头并显示所有内容)。

此功能是否可以在Docker日志中使用,而不必等待它遍历整个日志?

也许我正在为选项尝试错误的论点?使用我尝试过的可用文档

docker logs --since 1m somecontainer

docker logs -f --since 1m somecontainer

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

是否有一种无需等待就可以从当前点开始拖尾的方法? 我最好的选择是始终注销到某个外部文件,然后仅使用coreutils tail命令添加该文件吗?

5 个答案:

答案 0 :(得分:5)

我想知道为什么不使用docker logs --help来获得帮助吗?从最后10行开始,尝试以下操作。更多详细信息here

docker logs -f --tail 10 container_name

答案 1 :(得分:1)

日志驱动程序的默认设置是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个10兆json日志文件。结果是每个容器的日志限制在20-30兆之间。您需要在dockerd进程上触发重新加载以加载此文件(killall -HUP dockerdsystemctl reload docker)。

您可以通过在运行命令中(或在撰写文件中)传递日志选项来在单个容器上覆盖此设置:

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

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

最终结果是docker可能仍必须解析整个文件才能显示最新的日志,但是与默认的无限制日志记录选项相比,使用自动旋转日志文件的文件要小得多。

答案 2 :(得分:1)

或者,我们可以按时间(例如,从最近2分钟开始)按以下方式检查日志:

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

答案 3 :(得分:0)

我认为您的操作正确无误,并且在尝试时似乎可以正常工作。您是否正在使用某些非默认日志驱动程序等?

要仅关注新的日志文件,可以使用-f --since 0m

答案 4 :(得分:0)

使用-tail 开关:

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

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