systemd-journal: Suppressed N messages

问题现象: docker container logs 查看容器日志却没有任何返回结果. 开始以为是程序没有 stdout 标准输出, 但是后来测试, 将echo "log"作为死循环运行在容器中, 再次执行docker container logs依然没有任何日志输出. 找到一台”干净的”docker 服务器测试却可以正常显示日志

这台无法查看日志回显的服务器, Docker 的日志引擎配置为journald, 查看 journald 服务日志发现大量类似日志:

1
2
3
systemd-journal: Suppressed 9567 messages from /system.slice/
systemd-journal: Suppressed 6735 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>

参考文档: