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

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


当前回答

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

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

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

其他回答

在Docker for Windows和Mac上,也可能在其他平台上,可以使用tail选项。例如:

docker logs -f --tail 100

这样,只显示最后100行,你不需要首先滚动1M行……

(因此,删除日志可能是不必要的)

通过设置日志清除功能,可以定期清除日志。

“/etc/logrotate.d/docker-logs”文件示例

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}

如果你需要在删除之前存储日志文件的备份,我已经为指定的容器创建了一个执行以下操作的脚本(你必须使用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文件具有执行权限。

你也可以在docker运行命令行上提供log-opts参数,如下所示:

docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest

或者是码头式的。Yml是这样的

my-app:
image: my-app:latest
logging:
    driver: "json-file"
    options:
        max-size: "10m"
        max-file: "5"

致谢:https://medium.com/@Quigley_Ja/ roting-docker -logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)

作为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