我使用docker logs [container-name]来查看特定容器的日志。

有什么优雅的方法来清除这些日志吗?


当前回答

不确定这是否对您有帮助,但删除容器总是有帮助的。

所以,如果你使用docker-compose进行安装,你可以简单地使用docker-compose down && docker-compose up -d而不是docker-compose restart。通过适当的设置(确保对持久数据使用卷挂载),您不会以这种方式丢失任何数据。

当然,这比任务要求的要多。但是在各种情况下,其他答案都不起作用(如果使用远程docker服务器或在Windows机器上工作,访问底层文件系统是私有的,而且很困难)

其他回答

作为root用户,尝试执行以下命令:

>  /var/lib/docker/containers/*/*-json.log

or

cat /dev/null > /var/lib/docker/containers/*/*-json.log

or

echo "" > /var/lib/docker/containers/*/*-json.log

要移除/清除docker容器日志,我们可以使用下面的命令

$(docker inspect container_id|grep "LogPath"|cut -d """ -f4) 或 $(docker inspect container_name|grep "LogPath"|cut -d """ -f4)

Docker系统修剪 在命令提示符下执行该命令

如果你需要在删除之前存储日志文件的备份,我已经为指定的容器创建了一个执行以下操作的脚本(你必须使用sudo运行它):

创建一个文件夹以存储作为备份的压缩日志文件。 查找正在运行的容器的id(由容器名指定)。 使用随机名称将容器的日志文件复制到一个新位置(步骤1中的文件夹)。 压缩之前的日志文件(以节省空间)。 按您可以定义的特定大小截断容器的日志文件。

注:

It uses the shuf command. Make sure your linux distribution has it or change it to another bash-supported random generator. Before use, change the variable CONTAINER_NAME to match your running container; it can be a partial name (doesn't have to be the exact matching name). By default it truncates the log file to 10M (10 megabytes), but you can change this size by modifying the variable SIZE_TO_TRUNCATE. It creates a folder in the path: /opt/your-container-name/logs, if you want to store the compressed logs somewhere else, just change the variable LOG_FOLDER. Run some tests before running it in production.

#!/bin/bash
set -ex

############################# Main Variables Definition:
CONTAINER_NAME="your-container-name"
SIZE_TO_TRUNCATE="10M"

############################# Other Variables Definition:
CURRENT_DATE=$(date "+%d-%b-%Y-%H-%M-%S")
RANDOM_VALUE=$(shuf -i 1-1000000 -n 1)
LOG_FOLDER="/opt/${CONTAINER_NAME}/logs"
CN=$(docker ps --no-trunc -f name=${CONTAINER_NAME} | awk '{print $1}' | tail -n +2)
LOG_DOCKER_FILE="$(docker inspect --format='{{.LogPath}}' ${CN})"
LOG_FILE_NAME="${CURRENT_DATE}-${RANDOM_VALUE}"

############################# Procedure:
mkdir -p "${LOG_FOLDER}"
cp ${LOG_DOCKER_FILE} "${LOG_FOLDER}/${LOG_FILE_NAME}.log"
cd ${LOG_FOLDER}
tar -cvzf "${LOG_FILE_NAME}.tar.gz" "${LOG_FILE_NAME}.log"
rm -rf "${LOG_FILE_NAME}.log"
truncate -s ${SIZE_TO_TRUNCATE} ${LOG_DOCKER_FILE}

您可以创建一个cronjob来每月运行前面的脚本。第一次运行:

sudo crontab -e

在键盘上输入a进入编辑模式。然后添加如下一行:

0 0 1 * * /your-script-path/script.sh

按下退出键退出编辑模式。通过输入:wq并按enter键保存文件。确保script.sh文件具有执行权限。

首先是糟糕的答案。从这个问题中,你可以运行一行代码:

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

代替echo的是更简单的:

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

或者还有truncate命令:

truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

我对这两种都不太喜欢,因为它们直接修改Docker的文件。外部日志删除可能发生在docker将json格式的数据写入文件时,导致部分行,并破坏从docker日志命令行读取任何日志的能力。关于这种情况的例子,请看duketwo的回答:

清空日志文件后,我得到这个错误:错误从守护进程在流:错误抓取日志:无效字符'\x00'寻找值的开始

相反,您可以让Docker自动旋转日志。如果你使用默认的JSON日志驱动程序,这是通过额外的标记来完成的:

dockerd ... --log-opt max-size=10m --log-opt max-file=3

您还可以将其设置为守护进程的一部分。Json文件,而不是修改启动脚本:

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

这些选项需要配置为具有root访问权限。确保在更改此文件后运行systemctl reload docker来应用设置。这个设置将是所有新创建的容器的默认设置。注意,需要删除并重新创建现有容器以接收新的日志限制。


可以将类似的日志选项传递给各个容器以覆盖这些默认值,从而允许您在各个容器上保存更多或更少的日志。从docker运行,这看起来像:

docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...

或者在一个合成文件中:

version: '3.7'
services:
  app:
    image: ...
    logging:
      options:
        max-size: "10m"
        max-file: "3"

为了节省额外的空间,你可以从json日志驱动切换到“本地”日志驱动。它采用相同的max-size和max-file选项,但它使用更快更小的二进制语法,而不是存储在json中。这允许您在相同大小的文件中存储更多的日志。这个守护进程。Json条目看起来像这样:

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

本地驱动程序的缺点是依赖于直接访问json日志的外部日志解析器/转发器将不再工作。因此,如果你使用filebeat之类的工具向Elastic或Splunk的通用转发器发送信息,我会避免使用“本地”驱动程序。

我在我的提示和技巧演讲中有更多关于这方面的内容。