如何默认限制 “docker logs” 的输出

82次阅读
没有评论

问题描述

在使用 “docker logs” 命令查看正在运行的容器的日志时,忘记传递 “–tail” 选项。导致受影响的容器输出了数千万条日志。这些日志占用了大量的内存,导致服务器负载过高,甚至无法响应用户的操作。
用户想知道是否有一种方法可以在第一次输出日志时限制日志的数量,以避免这种情况的发生。用户还提到了可能需要添加 “ulimit”、”resource-control” 和 “linux” 标签,但由于声望不够,无法添加这些标签。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

一种限制 docker logs 输出的方法是在 docker daemon 的配置文件中指定限制。可以在 /etc/docker/daemon.json 文件中添加以下内容:

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

然后重新启动 docker daemon。
在上面的示例中,我们将日志驱动程序设置为 “json-file”,并使用 “log-opts” 参数指定了两个限制:
– “max-size”: “10m”:限制每个日志文件的最大大小为 10MB。
– “max-file”: “3”:限制最多保留 3 个日志文件。
通过设置这些限制,可以在一定程度上限制 docker logs 的输出量,避免出现过多的日志导致服务器负载过高的情况。
请注意,这些限制仅适用于新生成的日志文件,对于已经存在的日志文件不会生效。

方案2

使用脚本或工具来限制日志输出可能会增加复杂性,并且需要确保容器的日志输出不会被截断。
另一种方法是编写脚本或使用工具来控制日志的输出。你可以使用一些第三方工具来限制日志的输出量,或者编写自己的脚本来实现这个功能。
以下是一个简单的示例脚本,可以在输出日志之前检查日志的大小,并在达到一定限制时停止输出:

#!/bin/bash
# 检查日志文件的大小
log_size=$(docker inspect --format='{{.LogPath}}' container01 | xargs du -b | cut -f1)
# 设置日志大小限制(以字节为单位)
max_size=10485760  # 10MB
if [ $log_size -gt $max_size ]; then
  echo "The log size exceeds the limit. Output stopped."
else
  docker logs container01
fi

在这个示例中,我们首先使用 docker inspect 命令获取容器的日志文件路径,然后使用 du 命令获取日志文件的大小,并将其与预设的大小限制进行比较。如果日志文件的大小超过了限制,就停止输出日志;否则,继续使用 docker logs 命令输出日志。
请注意,这只是一个简单的示例脚本,你可以根据自己的需求进行修改和扩展。同时,使用脚本或工具来限制日志输出可能会增加复杂性,并且需要确保容器的日志输出不会被截断。
以上是两种限制 “docker logs” 输出的方法,你可以根据自己的需求选择适合的方法来解决这个问题。

正文完