先看现象。Ubuntu 22.04 上新加的服务跑起来了,journalctl -u app -f 一片空白,systemctl status 里也没有最近几行输出,可 /var/log/app.log 里日志写得好好的。

排查方向其实有限,先把可能性排一排。unit 里写了 StandardOutput=append:/var/log/app.log,输出绕过了 journald。也可能是Type=forking,主进程把 stdout 重定向到自己的日志文件,systemd 只拿到父进程的输出。

还有一种情况,journald 的 RateLimit 把该 unit 的日志丢弃,只剩一条 Suppressed 提示。

先看 unit 的输出配置

systemctl show app -p StandardOutput,StandardError

再往下改回 journal 并打上标识

删掉 StandardOutput 行 加 SyslogIdentifier=app

然后确认有没有被限流

journalctl -u app --no-pager | grep -i -m3 rate

末了重载并观察新日志

systemctl daemon-reload && systemctl restart app && journalctl -u app -n 20

同一份数据我导出了两份,一份留底,一份拿来试。

这类问题以前遇到过,但这次的触发条件和上次不一样。

怎么算真的好了,看的是同一批现象。journalctl -u app -n 20 能看到启动后的新日志,status 里显示最近十行,日志时间与当前时间相差在一分钟内。

补一句。输出重定向到文件就丢了 journald 的元数据和轮转,除非有集中采集否则不建议;被限流时 RateLimitBurst 要按日志量调。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189