Linux journalctl日志查看
服务突然崩溃时,最怕的是只看到一句“启动失败”却不知道从哪查。
用 journalctl 按服务和启动周期拉取日志,通常几分钟内就能把崩溃点定位到具体报错行。
下面按零基础也能照做的顺序讲清楚。
先确认日志系统是否可用
journalctl 依赖 systemd-journald,现代主流发行版默认都有。
先执行下面两条命令确认环境正常:
systemctl status systemd-journald
journalctl --disk-usage
第一条应显示 active (running)。
第二条会输出日志占用空间,例如 Archived and active journals take up 100M。
如果提示 command not found,说明系统未使用 systemd,需要改用 /var/log/ 下的传统日志文件。
如果日志占用过大或提示空间不足,可以先清理旧日志,但不要一上来就删:
sudo journalctl --vacuum-size=200M
结论:日志系统正常且磁盘有空间,是后续排查的前提。
按服务和时间缩小崩溃范围
直接 journalctl 输出太多,排查时要用过滤器。
假设崩溃的服务名是 nginx.service:
journalctl -u nginx.service -b --no-pager
参数含义:
-u指定服务单元,只看这个服务的日志。-b只看本次开机后的记录,避免翻到历史启动。--no-pager一次性输出,方便复制和搜索。
如果服务反复重启,用 -n 看最近几行更快:
journalctl -u nginx.service -n 50 --no-pager
判断条件:
如果日志末尾出现 Failed with result 'exit-code'、Main process exited、segfault 等字样,
崩溃点基本就在这几行附近。
抓住关键报错行
日志里真正有用的往往只有几行。
重点看这些信号:
Permission denied:通常是文件权限或运行用户不对。Address already in use:端口被占用,服务起不来。No such file or directory:配置或依赖文件路径写错。Out of memory或killed:进程被系统因内存不足终止。signal后跟数字:例如signal=11多为段错误,signal=9多为被强制杀死。
把报错时间点和系统其他日志对照,能排除是不是外部因素:
journalctl --since "2024-01-01 10:00:00" --until "2024-01-01 10:10:00" --no-pager
结论:先按服务过滤,再按时间窗口对照,能快速区分是服务自身问题还是系统级问题。
常见坑位和对应处理
- 只看
systemctl status不看 journal。status 往往只给一句摘要,详细堆栈在 journal 里。 - 忘记
-b,翻到上次开机的旧日志,误判成新问题。 - 日志被轮转清理,查不到崩溃时刻。可提前在
/etc/systemd/journald.conf中设置Storage=persistent并合理限制SystemMaxUse。 - 服务配置改了但没
daemon-reload,日志里仍显示旧参数。改完 unit 文件后执行sudo systemctl daemon-reload。 - 权限不足导致日志缺失。普通用户可能看不到完整日志,排查时用
sudo journalctl。
避坑要点:改配置后先 daemon-reload,再重启服务,否则日志和实际行为对不上。
修复后如何验证
改完问题后,重启服务并观察新日志:
sudo systemctl restart nginx.service
journalctl -u nginx.service -f
-f 会持续跟踪输出,按 Ctrl+C 退出。
看到 Started 且没有新的报错行,说明服务已正常拉起。
再确认一次状态和监听端口:
systemctl status nginx.service
ss -tlnp | grep nginx
验证标准:服务状态为 active (running),端口正常监听,且跟踪日志 1 到 2 分钟内没有重复报错。
几个常见疑问
日志里出现 Failed to start 但没有任何细节怎么办?
先加 -b -n 100 看完整尾部,再检查是否被 Rate limit 截断。
服务崩溃但 journal 里没有记录?
确认 systemd-journald 正在运行,并检查 /etc/systemd/journald.conf 是否禁用了持久化存储。
怎么只看某个时间点之后的错误级别日志?
可以用 journalctl -p err -b --no-pager,-p 按优先级过滤,err 及以上级别会显示。
掌握 journalctl -u、-b、-n、-f 这几个参数后,大多数服务崩溃都能在日志里找到直接线索。
遇到异常时,先回看避坑部分,再按验证步骤复查一遍。