我使用以下命令读取Docker容器日志输出
docker logs -f <container_name>
我通过调用console.log()将大量数据记录到node.js应用程序的日志中。我需要清理日志,因为它太长了,docker logs命令在到达结尾之前首先运行日志的现有行。我如何清理它以使其再次变短?我希望看到这样的命令:
console.log()
docker logs
docker logs clean <container_name>
但它似乎并不存在。
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文件中的日志:
/etc/docker/daemon.json
{ "log-driver": "json-file", "log-opts": {"max-size": "10m", "max-file": "3"} }
这允许docker在每个容器中保存最多3个日志文件,每个文件的大小限制为10兆(因此每个容器的日志限制在20到30兆之间)。您将需要运行systemctl reload docker来应用这些更改。这些更改是任何新创建的容器的默认值,这些设置不适用于已创建的容器。您需要删除并重新创建任何现有容器才能应用这些设置。
systemctl reload docker
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
epggiuax3#
如果要删除所有日志文件,而不仅仅是特定容器的日志,可以用途:
docker system prune
但是,请注意,这不会清除运行容器的日志。
jslywgbw4#
这不是理想的解决方案,但在Docker构建命令来执行此操作之前,这是一个很好的变通方法。创建包含以下内容的脚本文件docker-clean-logs.sh:
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
oogrdqng5#
您可以按照本文中的说明使用logrotatehttps://sandro-keil.de/blog/2015/03/11/logrotate-for-docker-container/这需要在启动容器之前完成。
sgtfey8w6#
运行:
docker inspect {containerId}
复制日志路径值
truncate -s 0 {LogaPath}
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时的错误。
i7uq4tfw8#
Docker群服务的解决方案:
logging: options: max-size: "10m" max-file: "10"
tpxzln5u9#
在Windows 10上,没有一个解决方案对我有效,我一直得到"没有这样的文件或目录"
docker-desktop-data
version-pack-data\community\docker\containers\CONTAINER_ID
CONTAINER_ID-json.log
source
9条答案
按热度按时间kg7wmglp1#
首先,如果您只需要查看更少的输出,您可以让Docker只显示最近的行:
或者你可以把一些行限制:
要删除Docker for Linux安装上的日志,可以对单个容器运行以下命令:
注意这需要root用户,我不推荐这样做。如果在docker向同一个文件写入日志的过程中将该文件置空,可能会损坏日志文件。相反,您应该配置docker来循环日志。
最后,您可以使用configure docker自动循环
/etc/docker/daemon.json
文件中的日志:这允许docker在每个容器中保存最多3个日志文件,每个文件的大小限制为10兆(因此每个容器的日志限制在20到30兆之间)。您将需要运行
systemctl reload docker
来应用这些更改。这些更改是任何新创建的容器的默认值,这些设置不适用于已创建的容器。您需要删除并重新创建任何现有容器才能应用这些设置。qaxu7uf22#
我找到的最好的剧本是
它会清除所有日志,您无需停止容器。
功劳归于https://bytefreaks.net/applications/docker/horrible-solution-how-to-delete-all-docker-logs
epggiuax3#
如果要删除所有日志文件,而不仅仅是特定容器的日志,可以用途:
但是,请注意,这不会清除运行容器的日志。
jslywgbw4#
这不是理想的解决方案,但在Docker构建命令来执行此操作之前,这是一个很好的变通方法。
创建包含以下内容的脚本文件
docker-clean-logs.sh
:向其授予执行权限:
停止要清洗的Docker容器:
然后运行上面的脚本:
最后再次运行容器:
感谢本页面的用户sgarbesi:https://github.com/docker/compose/issues/1083
oogrdqng5#
您可以按照本文中的说明使用logrotate
https://sandro-keil.de/blog/2015/03/11/logrotate-for-docker-container/
这需要在启动容器之前完成。
sgtfey8w6#
运行:
复制日志路径值
qgzx9mmu7#
为了在OSX上执行此操作,您需要访问运行Docker容器的虚拟机。
您可以使用walkerlee/nsenter映像在VM内运行命令,如下所示:
将其与公认答案的简化版本结合起来,你会得到:
保存它,放大它,运行它。
据我所知,这并不需要停止容器,而且,它清除了日志文件(而不是删除它),避免了在清理后立即执行
docker logs
时的错误。i7uq4tfw8#
Docker群服务的解决方案:
tpxzln5u9#
在Windows 10上,没有一个解决方案对我有效,我一直得到"没有这样的文件或目录"
这起作用了
docker-desktop-data
(在WSL中)version-pack-data\community\docker\containers\CONTAINER_ID
CONTAINER_ID-json.log
file并对其进行修剪,或者仅创建一个同名的空白文件source