【问题标题】:How to clean Docker container logs?如何清理 Docker 容器日志?
【发布时间】:2016-12-11 22:03:47
【问题描述】:

我使用

读取了我的 Docker 容器日志输出
docker logs -f <container_name>

我通过调用console.log() 将大量数据记录到我的node.js 应用程序的日志中。我需要清理日志,因为它太长了,docker logs 命令在到达末尾之前首先运行日志的现有行。如何清洁它以使其再次变短?我希望看到这样的命令:

docker logs clean <container_name>

但它似乎不存在。

【问题讨论】:

标签: docker


【解决方案1】:

首先,如果您只需要查看较少的输出,可以让 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 来轮换日志。


最后,您可以configure 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 来应用这些更改。这些更改是任何新创建的容器的默认值,它们不适用于已创建的容器。您需要删除并重新创建任何现有容器才能应用这些设置。

【讨论】:

  • 在 Ubuntu 中,您可以du -chs /var/lib/docker/containers/*/*json.log 了解您的容器日志正在使用多少空间。
  • 在 Ubuntu 服务器 19.04 中,您需要使用以下命令创建文件 /etc/default/docker: sudo echo 'DOCKER_OPTS="--config-file=/etc/docker/daemon.json"' > /etc/default/docker 并编辑文件 daemon.json。
  • 查看官方文档配置日志轮换:docs.docker.com/config/containers/logging/configure/…
【解决方案2】:

我找到的最好的脚本是

sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'

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

归功于https://bytefreaks.net/applications/docker/horrible-solution-how-to-delete-all-docker-logs

【讨论】:

  • 又短又甜,我喜欢,谢谢。
  • 仅用于清理特定容器的日志:truncate -s 0 $(docker inspect --format='{{.LogPath}}' &lt;container_name_or_id&gt;)
【解决方案3】:

如果你想删除所有的日志文件,不仅仅是针对特定容器的日志,你可以使用:

docker system prune

但是,请注意,这不会清除正在运行的容器的日志。

【讨论】:

  • 伟大的。这可能很明显,但请记住,这并不会清除正在运行的容器的日志。
  • 好吧..这可能有效。但是这样很危险!!这也会删除未使用的卷。
  • 这是在开发过程中清理沙箱的绝佳选择 - 谢谢!
  • 仅供参考,这不会清除正在运行的容器的日志。
  • @KonradKlockgether 这个没有标志 --volume 的命令不会删除卷。
【解决方案4】:

这不是理想的解决方案,但在 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

【讨论】:

  • 不知道以前能不能用,但肯定不能用了。
【解决方案5】:

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

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

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

【讨论】:

    【解决方案6】:

    为了在 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 时出错。

    【讨论】:

    • 在 MacOS (Big Sur) 上为我工作,与此处发布的所有其他解决方案不同。
    【解决方案7】:

    docker swarm 服务的解决方案:

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

    【讨论】:

      【解决方案8】:

      运行:

       docker inspect {containerId}
      

      复制 LogPath 值

      truncate -s 0 {LogaPath}
      

      【讨论】:

        猜你喜欢
        • 2017-07-19
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 1970-01-01
        • 2023-03-04
        • 2018-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多