← 返回技术随笔仓库

容器日志打爆磁盘:轮转配置全解

发布时间:2026-09-13容器云原生

Docker 默认 json-file 日志驱动把容器 stdout/stderr 全量写到 /var/lib/docker/containers/<id>/<id>-json.log,不轮转不删除,容器越话痨涨得越快。全局修复在 /etc/docker/daemon.json:{"log-driver": "json-file", "log-opts": {"max-size": "50m", "max-file": "3"}},每容器最多 150M,改完重启 docker 只对新建容器生效,存量容器要 recreate。

单容器覆盖用 compose 的 logging 段(driver + options),临时调试可以 docker run --log-opt max-size=10m。注意日志驱动改成 syslog/journald 后 docker logs 命令就不能用了(日志不归 docker 管了),这是很多团队改驱动后骂街的原因,权衡好。已经打爆的磁盘:truncate -s 0 对应的 json.log 文件立即释放(别 rm,句柄被 dockerd 持有),再用 du 确认。

K8s 环境同理但配置位置不同:kubelet 的 containerLogMaxSize/containerLogMaxSize 参数(默认 10Mi x 5 个文件,大集群常不够用),改 /var/lib/kubelet/config.yaml 后重启 kubelet。日志采集侧(filebeat/fluent-bit)读的就是这些轮转文件,轮转太激进会丢日志、太宽松会爆盘,50M x 3 是我们几十个节点的平衡点。应用侧治本:日志级别别开 DEBUG 跑生产、访问日志采样、异常堆栈去重,日志量本身降下来才是长久之计。