Docker:如何正确清除 Docker 容器的日志?

新手上路,请多包涵

我使用 docker logs [container-name] 来查看特定容器的日志。

有没有一种优雅的方法来清除这些日志?

原文由 Youssouf Maiga 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 9k
2 个回答

首先是不好的答案。从 这个问题 有一个你可以运行的单线:

 echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

而不是回声,有更简单的:

 : > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

或者有 truncate 命令:

 truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)


我不是其中任何一个的忠实粉丝,因为它们直接修改了 Docker 的文件。当 docker 将 json 格式的数据写入文件时,可能会发生外部日志删除,从而导致部分行,并破坏从 docker logs cli 读取任何日志的能力。有关发生这种情况的示例,请参阅 对 duketwo 的回答的评论

清空日志文件后,出现此错误: error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value

相反,您可以让 Docker 自动为您轮换日志。如果您使用默认的 JSON 日志记录驱动程序,则可以通过 dockerd 的附加标志来完成此操作:

 dockerd ... --log-opt max-size=10m --log-opt max-file=3

您也可以将其设置为 daemon.json 文件的一部分,而不是修改启动脚本:

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

这些选项需要配置为具有 root 访问权限。确保在更改此文件以应用设置后运行 systemctl reload docker 。然后,此设置将成为任何新创建容器的默认设置。请注意,需要删除并重新创建现有容器以接收新的日志限制。


可以将类似的日志选项传递给单个容器以覆盖这些默认值,从而允许您在单个容器上保存更多或更少的日志。从 docker run 这看起来像:

 docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...

或在撰写文件中:

 version: '3.7'
services:
  app:
    image: ...
    logging:
      options:
        max-size: "10m"
        max-file: "3"


为了额外节省空间,您可以从 json 日志驱动程序切换到“本地”日志驱动程序。它采用相同的 max-size 和 max-file 选项,但不是存储在 json 中,而是使用更快更小的二进制语法。这允许您在相同大小的文件中存储更多日志。 daemon.json 条目看起来像:

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

本地驱动程序的缺点是依赖于直接访问 json 日志的外部日志解析器/转发器将不再工作。因此,如果您使用诸如 filebeat 之类的工具发送到 Elastic 或 Splunk 的通用转发器,我会避免使用“本地”驱动程序。

在我的 提示和技巧演示文稿 中,我对此有更多的了解。

原文由 BMitch 发布,翻译遵循 CC BY-SA 4.0 许可协议

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