Answers:
从这个问题出发,您可以运行一种代码:
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 logs
cli 读取任何日志的能力。
相反,您可以让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而是使用更快和更小的二进制语法来存储在json中。这使您可以在相同大小的文件中存储更多日志。的daemon.json条目如下所示:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
本地驱动程序的缺点是依赖直接访问json日志的外部日志解析器/转发器将不再起作用。因此,如果您使用诸如filebeat之类的工具发送给Elastic或Splunk的通用转发器,则应避免使用“本地”驱动程序。
service docker restart
不起作用。在生效之前,还必须品牌创建新的容器。即,仅提起旧容器并没有应用新日志记录
echo -n > ...
。无论如何,我希望能够更好地控制我的日志。例如,在docker-compose重新启动后,我希望拥有一种机制来对保留的日志进行处理。
用:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
您可能需要sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
参考 杰夫·S。如何正确清除Docker容器的日志?
containers
否则将无法获得的内容。
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
-为我工作
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
在Windows和Mac(可能还有其他)的Docker上,可以使用tail选项。例如:
docker logs -f --tail 100
这样,仅显示最后100行,而您不必先滚动到1M行...
(因此,删除日志可能是不必要的)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
,仅获取日志的总大小sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
您可以设置logrotate定期清除日志。
/etc/logrotate.d/docker-logs中的示例文件
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
docker run
吗?文件/etc/logrotate.d/docker-logs
不存在,我必须创建它吗?
"log-opts"
如BMitch所示)
Docker4Mac,2018年解决方案:
LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH
第一行获取日志文件路径,类似于接受的答案。
第二行使用nsenter
此命令,您可以在xhyve
作为Docker4Mac下所有Docker容器的主机的VM中运行命令。我们运行的命令很熟悉truncate -s0 $LOGPATH
非Mac答案。
如果您使用docker-compose
,则第一行变为:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
并且<service>
是从服务的名称docker-compose.yml
的文件。
感谢https://github.com/justincormack/nsenter1的nsenter
技巧。
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
您不能直接通过Docker命令执行此操作。
您可以限制日志的大小,也可以使用脚本删除与容器相关的日志。您可以在此处找到脚本示例(从底部读取):功能:能够清除日志历史记录#1083
查阅docker-compose文件参考的日志记录部分,您可以在其中为某些日志记录驱动程序指定选项(例如日志轮换和日志大小限制)。
您还可以在docker run
命令行上提供log-opts参数,如下所示:
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
或像这样的docker-compose.yml
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
鸣谢:https : //medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412(James Quigley)
"5"
它的工作原理。10m
确实没有报价的工作。
适用于Mac用户的Docker,以下是解决方案:
通过以下方式查找日志文件路径:
$ docker inspect | grep log
通过SSH进入Docker机器(假设名称为default
,如果不是,请运行docker-machine ls
以找出答案):
$ docker-machine ssh default
更改为root用户(参考):
$ sudo -i
删除日志文件内容:
$ echo "" > log_file_path_from_step1
docker exec -it default sh
在容器中输入sh shell。但是,许多容器并没有隐式地使sudo
命令可用。
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"