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

有什么优雅的方法来清除这些日志吗?


当前回答

你也可以在docker运行命令行上提供log-opts参数,如下所示:

docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest

或者是码头式的。Yml是这样的

my-app:
image: my-app:latest
logging:
    driver: "json-file"
    options:
        max-size: "10m"
        max-file: "5"

致谢:https://medium.com/@Quigley_Ja/ roting-docker -logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)

其他回答

要移除/清除docker容器日志,我们可以使用下面的命令

$(docker inspect container_id|grep "LogPath"|cut -d """ -f4) 或 $(docker inspect container_name|grep "LogPath"|cut -d """ -f4)

Docker系统修剪 在命令提示符下执行该命令

首先是糟糕的答案。从这个问题中,你可以运行一行代码:

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

代替echo的是更简单的:

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

或者还有truncate命令:

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

我对这两种都不太喜欢,因为它们直接修改Docker的文件。外部日志删除可能发生在docker将json格式的数据写入文件时,导致部分行,并破坏从docker日志命令行读取任何日志的能力。关于这种情况的例子,请看duketwo的回答:

清空日志文件后,我得到这个错误:错误从守护进程在流:错误抓取日志:无效字符'\x00'寻找值的开始

相反,您可以让Docker自动旋转日志。如果你使用默认的JSON日志驱动程序,这是通过额外的标记来完成的:

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

您还可以将其设置为守护进程的一部分。Json文件,而不是修改启动脚本:

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

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


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

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中。这允许您在相同大小的文件中存储更多的日志。这个守护进程。Json条目看起来像这样:

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

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

我在我的提示和技巧演讲中有更多关于这方面的内容。

通过设置日志清除功能,可以定期清除日志。

“/etc/logrotate.d/docker-logs”文件示例

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}

感谢@BMitch的回答,我刚刚写了一个shell脚本来清理所有容器的日志:

#!/bin/bash
ids=$(docker ps -a --format='{{.ID}}')
for id in $ids
do
        echo $(docker ps -a --format='{{.ID}} ### {{.Names}} ### {{.Image}}' | fgrep $id)
        truncate -s 0 $(docker inspect --format='{{.LogPath}}' $id)
        ls -llh $(docker inspect --format='{{.LogPath}}' $id)
done