Docker Loki日志驱动致容器磁盘占用激增问题咨询
问题描述
通过Ansible Playbook部署Docker容器时,配置了Loki日志驱动以在Grafana中可视化日志,配置如下:
log_driver: loki log_options: "loki-url=http://myaddress/loki/api/v1/push" volumes: - "/var/log/docker/{{applicationName}}/:/var/log/{{applicationName}}/:rw"
起初运行正常,但一段时间后容器占用磁盘空间持续增长直至耗尽主机磁盘;重启Docker后问题暂时解决,但不久后会复发。
请问:
- 该问题是否与文件
/var/lib/docker/plugins/---id-plugin---/rootfs/var/log/docker/---container-id---/json.log有关?(其中---id-plugin---是docker plugin ls返回的Loki日志驱动ID) - 该文件的作用是什么?
解答
1. 磁盘增长问题与该文件的关联
是的,这个json.log文件正是导致磁盘空间持续耗尽的核心原因。
当Loki日志驱动无法正常将日志推送到配置的Loki服务(比如网络故障、Loki服务不可用、推送请求超时/失败)时,驱动会将本该推送的日志临时缓存到这个本地文件中。如果故障持续存在,缓存的日志会不断累积,最终占满主机磁盘。重启Docker时,这个缓存文件会被清理或重置,所以问题会暂时消失,但只要推送故障未解决,缓存会再次开始累积,导致问题复发。
另外需要注意你配置的宿主机挂载卷/var/log/docker/{{applicationName}}/:/var/log/{{applicationName}}/:rw,如果容器内的应用也在持续写入日志到这个目录,也可能加剧磁盘占用,但结合重启Docker后问题缓解的现象,主要原因还是Loki驱动的本地缓存文件。
2. 该文件的作用
这个json.log是Loki日志驱动的本地故障缓存文件,作用如下:
- 当驱动无法连接到Loki服务、推送请求失败或超时,会将待推送的日志条目写入该文件临时存储
- 后续当Loki服务恢复正常时,驱动会尝试读取该文件中的缓存日志并重新推送到Loki
- 它是一种容错机制,避免在Loki服务不可用期间丢失容器日志
解决建议
- 排查Loki服务连通性:验证容器所在主机能否正常访问
http://myaddress/loki/api/v1/push,检查Loki服务状态、网络策略(防火墙、代理)是否正常 - 配置缓存大小限制:在
log_options中添加缓存限制参数,避免无限制增长。例如:
log_options: loki-url: "http://myaddress/loki/api/v1/push" loki-max-backlog-size: "100m" loki-max-backlog-items: "10000"
- 定期清理缓存(临时方案):如果暂时无法修复Loki连通性,可通过脚本定期清理该缓存文件,但需注意这会导致未推送的日志丢失
- 检查容器日志写入:确认容器内应用是否在挂载目录下生成大量日志,必要时配置日志轮转
内容的提问来源于stack exchange,提问作者Robi
相关产品推荐
相关产品推荐

