我使用
Docker
容器日志输出读取我的日志。
docker logs -f <container_name>
通过调用console.log()
,我在我的node.js应用程序中记录了大量数据到日志中。 我需要清理日志,因为它已经变得太长了,而docker logs
命令会先运行现有日志的行,然后才能到达结尾。如何清理日志以使其再次变短? 我想看到像这样的一个命令:
docker logs clean <container_name>
但似乎它并不存在。
我使用
Docker
容器日志输出读取我的日志。
docker logs -f <container_name>
通过调用console.log()
,我在我的node.js应用程序中记录了大量数据到日志中。 我需要清理日志,因为它已经变得太长了,而docker logs
命令会先运行现有日志的行,然后才能到达结尾。如何清理日志以使其再次变短? 我想看到像这样的一个命令:
docker logs clean <container_name>
但似乎它并不存在。
首先,如果您只需要查看较少的输出,您可以让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来轮换日志。
最后,您可以通过在/etc/docker/daemon.json
文件中添加以下内容来 配置Docker 自动轮换日志:
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
这允许 Docker 为每个容器保留多达 3 个日志文件,每个文件限制为 10 兆字节(因此每个容器的日志限制在 20 到 30 兆字节之间)。您需要运行 systemctl reload docker
来应用这些更改。这些更改是任何新创建的容器的默认设置,不适用于已经创建的容器。您需要删除和重新创建任何现有容器才能应用这些设置。
du -chs /var/lib/docker/containers/*/*json.log
жќҐдє†и§ЈдЅ зљ„е®№е™Ёж—Ґеї—еЌ з”Ёдє†е¤ље°‘з©єй—ґгЂ‚ - hisa_py我发现的最好的脚本是
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}}' <container_name_or_id>)
- char如果您想删除所有日志文件,而不仅仅是特定容器的日志,则可以使用:
docker system prune
但是请注意,这不会清除正在运行容器的日志。
这不是理想的解决方案,但在 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
运行:
docker inspect {containerId}
复制LogPath值
truncate -s 0 {LogaPath}
您可以按照此文章中的说明使用logrotate。
https://sandro-keil.de/blog/2015/03/11/logrotate-for-docker-container/
在启动容器之前需要执行此操作。
Docker Swarm服务的解决方案:
logging:
options:
max-size: "10m"
max-file: "10"
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
命令时出现错误。在Windows 10上,这些解决方案都没有起作用,我一直收到“没有这样的文件或目录”错误。
docker-desktop-data
(在WSL中)version-pack-data\community\docker\containers\CONTAINER_ID
CONTAINER_ID-json.log
文件并将其修剪或只需创建一个同名的空文件
json-file
日志驱动程序使用基于文件的存储。这些文件被设计为仅由Docker守护程序访问。使用外部工具与这些文件进行交互可能会干扰Docker的日志系统并导致意外行为,应该避免”。这意味着建议简单截断日志文件的答案必须被视为错误。 - undefined