我使用docker logs [container-name]来查看特定容器的日志。
有什么优雅的方法来清除这些日志吗?
我使用docker logs [container-name]来查看特定容器的日志。
有什么优雅的方法来清除这些日志吗?
当前回答
我更喜欢这个(从上面的解决方案):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
然而,我正在运行几个系统(Ubuntu 18。x Bionic为例),该路径不能正常工作。Docker是通过Snap安装的,所以到容器的路径更像:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
其他回答
Docker为Mac用户,这里是解决方案:
查找日志文件路径: $ docker inspect | grep日志 SSH进入docker机器(假设名称是默认的,如果不是,运行docker-machine ls来查找): $ docker-machine SSH默认 更改为root用户(参考): $ sudo -i 删除日志文件内容: $ echo "" > log_file_path_from_step1 .
不确定这是否对您有帮助,但删除容器总是有帮助的。
所以,如果你使用docker-compose进行安装,你可以简单地使用docker-compose down && docker-compose up -d而不是docker-compose restart。通过适当的设置(确保对持久数据使用卷挂载),您不会以这种方式丢失任何数据。
当然,这比任务要求的要多。但是在各种情况下,其他答案都不起作用(如果使用远程docker服务器或在Windows机器上工作,访问底层文件系统是私有的,而且很困难)
这将删除所有容器的日志文件:
sudo find /var/lib/docker/containers/ -type f -name "*.log" -delete
首先是糟糕的答案。从这个问题中,你可以运行一行代码:
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的通用转发器发送信息,我会避免使用“本地”驱动程序。
我在我的提示和技巧演讲中有更多关于这方面的内容。
在我的Ubuntu服务器上,即使是sudo,我也会得到无法打开' /var/lib/docker/containers/*/*-json.log '来写:没有这样的文件或目录
但是结合docker检查和截断答案是有效的:
sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`