2、Docker日志基础:Docker日志驱动类型与轮转机制

在生产环境中,Docker容器的标准输出(stdout/stderr)并不会自动持久化到宿主机文件系统。Docker通过日志驱动(Log Driver)机制接管容器的标准输出流,并将其路由到指定的后端。理解日志驱动的类型、默认存储路径与轮转机制,是构建可靠ELK采集管道的前提。

2.1 日志驱动类型与对比

Docker支持多种日志驱动,生产环境中最常用的三种为 json-file、syslog 和 journald。下表从数据格式、持久化方式、适用场景三个维度进行对比:

驱动类型 数据格式 持久化方式 适用场景
json-file 每行一条JSON对象 宿主机本地文件 单机调试、Filebeat直接采集
syslog RFC 5424 结构化日志 远程syslog服务器或本地socket 已有syslog基础设施的企业
journald 二进制journal条目 systemd journal 与systemd深度集成的Linux发行版
选型建议:在ELK集成场景中,json-file 是最通用的选择。Filebeat原生支持读取JSON格式日志文件,且无需额外转换中间件。若集群规模较大且已有集中式syslog通道,可选用 syslog 驱动;journald 适合与systemd-journald配合使用,但采集时需额外配置journalbeat或systemd-journal网关。

2.2 默认存储路径与文件结构

当使用 json-file 驱动时,Docker将每个容器的日志存储在宿主机特定路径下。默认存储路径为:

/var/lib/docker/containers/<container_id>/<container_id>-json.log

每条日志记录为一个独立的JSON对象,包含以下关键字段:

  • log:容器输出的原始日志行内容
  • stream:输出流类型,stdout 或 stderr
  • time:日志产生的时间戳(RFC 3339格式)

示例日志行:

{"log":"2025-03-21 10:15:30.123  INFO  [http-nio-8080-exec-1] com.example.controller.UserController - 用户查询成功\n","stream":"stdout","time":"2025-03-21T10:15:30.123456789Z"}
注意:默认路径位于Docker数据目录下,若宿主机磁盘空间不足,日志文件可能撑满根分区。生产环境建议将Docker数据目录挂载到独立的数据盘,或配置日志轮转策略。

2.3 日志轮转机制

为避免单个日志文件无限增长,Docker为 json-file 驱动提供了内置的轮转参数。这些参数在启动容器时通过 --log-opt 指定,也可在Docker Daemon配置文件中全局设置。

核心轮转参数:

参数名 默认值 说明
max-size -1(不限制) 单个日志文件的最大大小,如 10m、100m
max-file 1 保留的日志文件数量(含当前文件)
compress false 轮转后的旧日志文件是否压缩为 .gz

配置示例(Docker Daemon全局配置 /etc/docker/daemon.json):

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

轮转行为说明:

  • 当当前日志文件达到 max-size 时,Docker自动关闭当前文件,创建新文件继续写入。
  • 旧文件按序号递增命名:xxx-json.log.1、xxx-json.log.2……
  • 当文件数量超过 max-file 时,最旧的文件被删除。
  • 若 compress 为 true,轮转后的文件自动压缩为 .gz 格式,节省磁盘空间。
生产建议:在ELK采集场景中,建议将 max-size 设置为 10m 或 50m,max-file 设置为 3~5。过大的单文件会导致Filebeat读取延迟增加;过小的文件则会产生大量小文件,增加文件描述符压力。同时开启 compress 可减少磁盘占用约60%~80%。

2.4 日志驱动与轮转流程总览

下图展示了从容器标准输出到日志文件轮转的完整链路:

Docker日志驱动与轮转流程 容器 stdout/stderr 日志驱动 json-file / syslog / journald json-file 本地文件 syslog 远程服务器 journald systemd-journal 轮转机制 max-size / max-file / compress 日志文件集合 xxx-json.log / .1 / .2.gz Filebeat 采集 读取JSON日志行 采集要点 轮转后的压缩文件 需配置close_inactive

2.5 生产环境配置清单

以下为生产环境推荐配置清单,确保日志采集的稳定性和可观测性:

  1. 全局配置:在 /etc/docker/daemon.json 中设置 json-file 驱动及轮转参数,避免每个容器单独配置。
  2. 磁盘监控:对 /var/lib/docker/containers/ 目录设置磁盘使用率告警,阈值建议为80%。
  3. 采集适配:Filebeat配置 close_inactive: 5m 和 scan_frequency: 10s,确保轮转文件被及时关闭和重新扫描。
  4. 时间同步:确保宿主机NTP服务正常运行,日志时间戳的准确性直接影响ELK链路追踪。
  5. 权限控制:Filebeat运行用户需具备对 /var/lib/docker/containers/ 目录的读取权限,建议通过 docker group 或直接授权。
验证命令:使用 docker inspect <container_name> --format '{{.HostConfig.LogConfig}}' 可快速查看容器的日志驱动配置。使用 ls -lh /var/lib/docker/containers/<container_id>/ 可查看日志文件大小与轮转状态。