Linux journalctl 命令:systemd 日志查询与故障定位指南
在采用 systemd 的现代 Linux 发行版(CentOS 7+、Ubuntu 16.04+、Debian 8+ 等)中,journalctl 是日志排查的第一入口。所有日志由 systemd-journald 守护进程统一收集,以二进制格式存储在 /var/log/journal/ 目录下,支持结构化查询和高效索引。相比传统文本日志,它的优势在于:无需手动 grep 多个文件、自动轮转不占满磁盘、支持按进程/服务精确过滤。
最基础的用法
journalctl
不加参数会输出从系统启动以来的全部日志,内容极多,通常需要用管道过滤或配合分页参数使用。默认通过 less 分页显示,按 q 退出,/ 可以搜索关键字。
实际使用中,高频场景与命令组合
1. 按服务(Unit)过滤
这是最常用的场景,直接定位某个服务的日志。
journalctl -u nginx.service
或简写为 journalctl -u nginx。可以指定多个服务同时查看:
journalctl -u nginx -u php-fpm
2. 按时间范围过滤
查看今天的日志:
journalctl --since today
查看最近 1 小时的日志:
journalctl --since "1 hour ago"
查看指定时间段的日志:
journalctl --since "2026-10-03 14:00:00" --until "2026-10-03 15:00:00"
时间格式非常灵活,支持自然语言如 "yesterday"、"2 days ago" 等。
3. 实时追踪日志(类似 tail -f)
journalctl -f
-f (follow) 模式会持续输出新产生的日志,非常适合在重启服务或触发操作时实时观察输出。也可以结合服务名使用:
journalctl -u mysql -f
4. 按启动周期过滤
查看本次启动以来的日志:
journalctl -b
查看上一次启动周期的日志:
journalctl -b -1
查看倒数第三次启动的日志:
journalctl -b -3
当服务器意外重启后,用 -b -1 可以快速查看崩溃前的最后日志,定位根因。
5. 按日志级别过滤
journalctl -p err
-p (priority) 支持 emerg、alert、crit、err、warning、notice、info、debug 八个级别。journalctl -p err 只显示错误及以上级别的日志,过滤掉大量无关信息。
6. 查看内核日志
journalctl -k
等价于传统 dmesg,但支持时间过滤和分页。排查硬件故障、驱动问题时常用。
7. 查看特定进程的日志
如果你知道出问题的进程 PID:
journalctl _PID=1234
或者通过可执行文件路径过滤:
journalctl /usr/bin/python3
8. 输出格式控制
无分页、纯文本输出(适合管道处理):
journalctl --no-pager -u nginx
JSON 格式输出(适合程序解析):
journalctl -u nginx -o json
简洁输出(去掉主机名、优先级等前缀):
journalctl -o short-iso
如果不知道如何下手,可以先尝试
journalctl -xe
-x 会尝试为常见错误码添加解释性说明,-e 直接跳转到日志末尾(最新内容)。这是快速了解"刚才发生了什么"的快捷方式。
或者,当你发现某个服务启动失败时,标准排查流程是:
systemctl status nginx # 1. 先看服务状态和最后几行日志
journalctl -u nginx -n 50 # 2. 查看该服务最近 50 行日志
journalctl -u nginx --since "10 min ago" # 3. 如果刚重启过,看最近 10 分钟
- 点赞
- 收藏
- 关注作者
评论(0)