查 systemd 服务日志最直接用 journalctl -u unit.service,注意必须带 .service 后缀;常用组合有 -b(当前 boot)、-f(实时跟踪)、--since(指定时间范围),配合 --no-pager | grep -i 可高效过滤,日志缺失需检查 journald 存储配置并重启服务。

查某个服务的日志,用 -u 参数最直接
systemd 服务日志默认按 unit 名组织,journalctl -u sshd.service 就能查 SSH 服务的全部日志。注意 service 名要带 .service 后缀(即使 systemctl list-units 里显示为 sshd),漏掉会查不到任何内容。
常见错误是输成 journalctl -u sshd —— 这时 journalctl 会静默返回空结果,不报错也不提示,容易误以为没日志。
- 确认服务名:先运行
systemctl list-units --type=service | grep ssh看准确 unit 名 - 只查当前 boot:加
-b,避免混入上次开机的日志 - 实时跟踪:加
-f,类似tail -f,适合调试启动过程
想看服务最近一次启动的日志,用 --since + --unit
journalctl 的 -u 默认查所有历史,但很多问题只发生在刚重启后。这时更高效的方式是定位“这次启动以来”的日志:
journalctl -u nginx.service --since "2024-05-20 14:30:00"
或者用相对时间:journalctl -u nginx.service --since "10 minutes ago"。注意时间字符串必须用双引号包裹,否则 shell 会把空格当分隔符。
- 如果服务刚
systemctl restart nginx过,用--since "1 minute ago"比翻屏快得多 -
--since和-u可以共存,但不能和--boot混用(后者优先级更高) - 时间格式不严格,
"yesterday"、"2 hours ago"都支持,但中文如“昨天”不行
日志太多看不清?用 --no-pager 或管道过滤
默认 journalctl 走 PAGER(通常是 less),但交互式翻页对自动化或远程终端不友好。直接加 --no-pager 输出到 stdout,方便配合 grep:
journalctl -u docker.service --no-pager | grep -i "failed"
注意:加了 --no-pager 后,less 的搜索功能(/ 键)就没了,得靠 grep 替代。
-
--no-pager不影响日志内容,只改输出方式 - 过滤关键词时,
grep -i更实用——journal 日志里大小写不统一(比如 “Failed” 和 “failed” 都有) - 避免用
cat $(journalctl -u xxx --output=export)这类绕弯写法,--output=json才适合结构化处理
查不到日志?先确认日志是否被轮转或存储策略限制
journalctl 查不到内容,大概率不是命令写错,而是日志根本没存下来。systemd-journald 默认只保留近期日志,尤其在 /run/log/journal(内存临时目录)下,重启就清空。
运行 journalctl --disk-usage 看当前占用;用 sudo journalctl --vacuum-size=500M 手动清理(慎用);长期保存需配置 /etc/systemd/journald.conf:
- 把
Storage=auto改成Storage=persistent,并确保/var/log/journal/目录存在且可写 -
SystemMaxUse=控制总大小,MaxFileSec=控制单个日志文件生命周期(默认 1month) - 改完要
sudo systemctl restart systemd-journald,否则不生效
这些配置项不生效是常见盲区——很多人只改了 conf 却忘了重启 journald。


















