问题现象: docker container logs 查看容器日志却没有任何返回结果. 开始以为是程序没有 stdout 标准输出, 但是后来测试, 将
echo "log"
作为死循环运行在容器中, 再次执行docker container logs
依然没有任何日志输出. 找到一台”干净的”docker 服务器测试却可以正常显示日志
这台无法查看日志回显的服务器, Docker 的日志引擎配置为journald
, 查看 journald 服务日志发现大量类似日志:
1 | systemd-journal: Suppressed 9567 messages from /system.slice/ |
根据字面意思理解就是日志被丢弃了, 看来是由于 journald 服务的问题导致的日志问题
在 journald 中, 有如下两个参数跟此问题相关:
- RateLimitInterval
- RateLimitBurst
RateLimitInterval
是指定时间间隔, 意思就是说, 在RateLimitInterval
这段时间内的日志总量(总条数)控制在RateLimitBurst
以内. 这两个参数搭配使用可以用来控制日志速率, 避免由于大量日志输出导致的一系列性能问题.
该问题的根源在于该主机目前日志输出的速率超出了 journald 默认的配置, 你可以自定定义该速率, 也可以将RateLimitInterval
设置为0
, 以禁用速率控制
接下来重启 journald 以生效配置
1 | systemctl restart systemd-journald |
注意: 重启 journald 服务可能会引发一个 systemd 的 bug, 详情请参考下篇文章<systemd-journald的SIGPIPE信号BUG>
参考文档: