如何清理Docker容器日志?

时间:2016-12-11 22:03:48

标签: docker

我使用

读取了Docker容器日志输出
-arch=compute_60

我通过调用docker logs -f <container_name> 将大量数据记录到我的node.js应用程序的日志中。我需要清理日志,因为它太长了,console.log()命令首先在日志的现有行中运行,然后才能结束。如何清洁它再次缩短?我想看一个像:

这样的命令
docker logs

但它似乎不存在。

8 个答案:

答案 0 :(得分:43)

首先,如果你只需要看到更少的输出,你可以让docker只显示更新的行:

docker logs --since 30s -f <container_name_or_id>

或者你可以设置一些限制行:

docker logs --tail 20 -f <container_name_or_id>

要删除Docker for Linux安装上的日志,可以对单个容器运行以下命令:

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

请注意,这需要root,我不建议这样做。如果在docker将日志写入同一文件的过程中使文件为空,则可能会损坏日志文件。相反,您应该配置docker来旋转日志。

最后,您可以将docker配置为使用以下/etc/docker/daemon.json文件中的以下内容自动轮换日志:

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

这允许docker每个容器最多保留3个日志文件,每个文件限制为10兆(因此每个容器限制20到30兆的日志)。您需要运行systemctl reload docker来应用这些更改。这些更改是任何新创建的容器的默认值,它们不适用于已创建的容器。您需要删除并重新创建任何现有容器才能应用这些设置。

答案 1 :(得分:9)

这不是理想的解决方案,但在Docker构建命令之前,这是一个很好的解决方法。

使用以下内容创建脚本文件docker-clean-logs.sh

#!/bin/bash

rm $(docker inspect $1 | grep -G '"LogPath": "*"' | sed -e 's/.*"LogPath": "//g' | sed -e 's/",//g');

授予执行权限:

chmod +x ./docker-clean-logs.sh

停止要清理的Docker容器:

docker stop <container_name>

然后运行上面的脚本:

./docker-clean-logs.sh <container_name>

最后再次运行你的容器:

docker start ...

此页面上显示的是用户sgarbesi:https://github.com/docker/compose/issues/1083

答案 2 :(得分:5)

我发现的最好的脚本是

 df.material = replace_values(df.material, d)

它将清除所有日志,您无需停止容器。

贷方转到https://bytefreaks.net/applications/docker/horrible-solution-how-to-delete-all-docker-logs

答案 3 :(得分:2)

运行:

 docker inspect {containerId}

复制 LogPath 值

truncate -s 0 {LogaPath}

答案 4 :(得分:1)

您可以按照本文中的说明使用logrotate

https://sandro-keil.de/blog/2015/03/11/logrotate-for-docker-container/

这需要在启动容器之前完成。

答案 5 :(得分:1)

为了在OSX上执行此操作,您需要访问运行Docker容器的虚拟机。

您可以使用walkerlee/nsenter图像在VM中运行命令,如下所示:

docker run --rm -it --privileged --pid=host walkerlee/nsenter -t 1 -m -u -i -n sh

将其与您接受的答案的简化版本相结合:

#!/bin/sh
docker run --rm -it --privileged --pid=host walkerlee/nsenter -t 1 -m -u -i -n \
    cp /dev/null $(docker inspect -f '{{.LogPath}}' $1)

保存,chmod +x,运行它。

据我所知,这并不需要停止容器。此外,它会清除日志文件(而不是删除它),以便在清理后立即执行docker logs时避免错误。

答案 6 :(得分:0)

docker swarm服务的解决方案:

   logging:
     options:
       max-size: "10m"
       max-file: "10"

答案 7 :(得分:0)

如果要删除所有日志文件,不仅要删除特定容器的日志,还可以使用:

>$ docker system prune