先看现象。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 要按日志量调。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
