最准、最全查服务日志的方式是 journalctl -u 服务名.service;systemctl status 仅显示摘要,详细错误需用 journalctl 查看,支持按行数、时间、级别、PID 等筛选,并可启用持久化存储和指定启动会话排查。

systemctl logs 看不到实时输出?用 journalctl -u
直接用 systemctl status 只能看到服务最近几行状态摘要,不是完整 stdout/stderr。真要查服务启动后打印的日志,得用 journalctl,它是 systemd 日志的唯一权威接口。
最常用命令是:
journalctl -u <service-name>.service比如查 Nginx:
journalctl -u nginx.service默认从日志开头开始显示,通常太长,加
-n 50 限制行数,或加 --since "1 hour ago" 按时间过滤。
为什么 journalctl 默认不显示 stdout?它其实全收了
systemd 启动的服务,只要没重定向 StandardOutput 或 StandardError(比如设成 syslog 或 none),所有 printf/fprintf/echo 输出都会被 journald 自动捕获为日志条目,并打上 SYSLOG_IDENTIFIER 或 UNIT 标签。所以你看到的就是真实 stdout/stderr,不是“替代品”。
- 确认是否被重定向:运行
systemctl show <service-name>.service | grep -E "(StandardOutput|StandardError)"</service-name>,若值为journal(默认)或journal+console,日志就进了 journal - 若值为
file:/path或append:/path,那 stdout 被写进文件了,journalctl就看不到 - 若值为
none,程序输出被丢弃,journal 里自然为空
journalctl 怎么只看最新几条?别用 tail -n
tail -n 20 $(journalctl -u xxx) 是错的——journalctl 输出不是文件流,不能直接管道给 tail;而且会一次性加载全部日志,效率低、内存涨。
- 正确做法:用
-n 20(等价于--lines=20),例如journalctl -u sshd.service -n 20
- 想持续跟踪新日志:加
-f(类似tail -f),journalctl -u docker.service -f
- 按优先级过滤:加
-p err只看 error 级别,-p info看 info 及以上(注意:info 级别包含 notice/warn/err)
服务刚重启过,但 journalctl 还是旧日志?检查日志存储模式
如果系统重启过,或者 journald 配置为 volatile(日志存在 /run/log/journal),那旧日志可能已丢失。默认情况下,日志只存内存或临时目录,不会持久化到磁盘。
- 检查当前日志路径:
journalctl --disk-usage
若返回0B,说明没启用持久存储 - 启用持久化:创建目录
/var/log/journal并重启journald:sudo mkdir -p /var/log/journal && sudo systemctl restart systemd-journald
- 持久化后,
journalctl才能查到上次开机前的日志;否则最多只能看到本次 boot 之后的内容(可用journalctl --list-boots查看可选 boot ID)
.service 后缀,少写会查不到;另外,有些服务用的是 socket 或 timer 触发,真正干活的是另一个 unit,这时候得看对应的实际 service 名,而不是触发器名。


















