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 日志驱动与轮转流程总览
下图展示了从容器标准输出到日志文件轮转的完整链路:
2.5 生产环境配置清单
以下为生产环境推荐配置清单,确保日志采集的稳定性和可观测性:
- 全局配置:在
/etc/docker/daemon.json中设置json-file驱动及轮转参数,避免每个容器单独配置。 - 磁盘监控:对
/var/lib/docker/containers/目录设置磁盘使用率告警,阈值建议为80%。 - 采集适配:Filebeat配置
close_inactive: 5m和scan_frequency: 10s,确保轮转文件被及时关闭和重新扫描。 - 时间同步:确保宿主机NTP服务正常运行,日志时间戳的准确性直接影响ELK链路追踪。
- 权限控制:Filebeat运行用户需具备对
/var/lib/docker/containers/目录的读取权限,建议通过docker group或直接授权。
验证命令:使用
docker inspect <container_name> --format '{{.HostConfig.LogConfig}}' 可快速查看容器的日志驱动配置。使用 ls -lh /var/lib/docker/containers/<container_id>/ 可查看日志文件大小与轮转状态。