【问题标题】:Tail docker logs to see recent records, not all如何在不查看整个文件或等待它遍历整个文件的情况下从日志中的当前位置跟踪 docker 日志
【发布时间】:2019-02-06 17:52:31
【问题描述】:

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

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

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

docker logs --since 1m somecontainer

docker logs -f --since 1m somecontainer

它似乎实际上遍历了整个日志文件(可能需要很长时间),然后在达到您指定的时间范围后开始回显到屏幕。

有没有办法直接从当前点开始拖尾而无需等待? 我最好的选择是始终注销到某个外部文件并使用 coreutils tail 命令对其进行尾部操作吗?

【问题讨论】:

  • 您是否需要出于其他原因保留整个日志文件,或者您是否可以只保留最后几兆日志。
  • 我只需要最后几兆就可以了。您是否建议使用 fifo 缓冲区?
  • 有一个选项可以让 docker 自动轮换日志。因此,不必等待几分钟来解析数百兆的日志,您可以将日志文件限制为只有几兆。不完全是您要求的解决方案,但它会显着加快速度,这似乎是您的目标。

标签: docker logging


【解决方案1】:

请阅读docker logs --help 寻求帮助。试试下面,从最后 10 行开始。更多详情here.

docker logs -f --tail 10 container_name

【讨论】:

  • 当你有一个非常大的 json 日志文件(例如几个 gigs 大小)时,这会跳过 docker 引擎对最后 10 行的所有行的解析吗?
  • @BMitch 虽然我在docker.com的官网上没有找到任何描述,但是我做了一些测试。从一个 16G 的大日志文件中获取最后 200 行日志的时间不到 0.5 秒。我认为这可能是一个证据。
  • @BMitch 是的。
【解决方案2】:

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

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

【讨论】:

  • OP 在他们的回答中将此作为非选项发布:“看来它实际上遍历了整个日志文件(这可能需要很长时间),然后一旦到达您指定的时间范围。"
  • 使用上面的原因很容易重新加载/刷新最新的活动日志,如果我使用docker logs -f --tail 10 &lt;container_name&gt;,我们必须不断地从光标中出来才能加载最新的日志。跨度>
  • 这解释了为什么您更喜欢这个而不是其他赞成的答案,但不是为什么当 OP 特别列出此选项的问题并且正在寻找不会首先解析日志文件的替代方案时您推荐这个的原因。他们列出的问题是当他们有一个非常大的日志文件时,他们不想在输出之前对其进行解析。
  • 我同意你的看法,我只是提供一个替代选项,只是在这里检查日志。
【解决方案3】:

使用 --tail 开关:

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

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

【讨论】:

    【解决方案4】:

    我认为您的做法是正确的,并且在我尝试时它似乎按预期工作。您是否使用了一些非默认日志驱动程序等?

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

    【讨论】:

    • 感谢您的回复。我正在使用默认的日志驱动程序 - json-file。我可能只是切换到 syslog 并查看主机上的日志。
    • 我也尝试按照您的建议使用-f --since 0m。在返回输出之前,它仍然花了 2 分钟遍历完整的日志文件。这并不糟糕,但确实会增加调试时间。
    【解决方案5】:

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

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

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

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

    最终结果是 docker 可能仍然需要解析整个文件以向您显示最新的日志,但是与默认的无限制日志记录选项相比,自动轮换日志的文件会小得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多