如何清理Docker集装箱日志?

olhwl3o2  于 2023-01-25  发布在  Docker
关注(0)|答案(9)|浏览(154)

我使用以下命令读取Docker容器日志输出

docker logs -f <container_name>

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

docker logs clean <container_name>

但它似乎并不存在。

kg7wmglp

kg7wmglp1#

首先,如果您只需要查看更少的输出,您可以让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来应用这些更改。这些更改是任何新创建的容器的默认值,这些设置不适用于已创建的容器。您需要删除并重新创建任何现有容器才能应用这些设置。

qaxu7uf2

qaxu7uf22#

我找到的最好的剧本是

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

epggiuax

epggiuax3#

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

docker system prune

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

jslywgbw

jslywgbw4#

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

oogrdqng

oogrdqng5#

您可以按照本文中的说明使用logrotate
https://sandro-keil.de/blog/2015/03/11/logrotate-for-docker-container/
这需要在启动容器之前完成。

sgtfey8w

sgtfey8w6#

运行:

docker inspect {containerId}

复制日志路径值

truncate -s 0 {LogaPath}
qgzx9mmu

qgzx9mmu7#

为了在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)

保存它,放大它,运行它。
据我所知,这并不需要停止容器,而且,它清除了日志文件(而不是删除它),避免了在清理后立即执行docker logs时的错误。

i7uq4tfw

i7uq4tfw8#

Docker群服务的解决方案:

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

tpxzln5u9#

在Windows 10上,没有一个解决方案对我有效,我一直得到"没有这样的文件或目录"

这起作用了

  • 获取容器ID(检查容器)
  • 在文件资源管理器中打开docker-desktop-data(在WSL中)
  • 导航到version-pack-data\community\docker\containers\CONTAINER_ID
  • 停止容器
  • 打开文件CONTAINER_ID-json.log file并对其进行修剪,或者仅创建一个同名的空白文件

source

相关问题