journalctl 怎样按服务和启动周期筛选日志
来源:17golang原创
时间:2026-10-15 06:06:16 356浏览 收藏
排查 systemd 服务时,最容易混淆的是“哪个服务”和“哪次启动”两个条件。journalctl -u nginx.service -b 只看 nginx 在当前启动周期内的日志;把 -b 换成 -1,就能查看上一次启动周期。关键是先列出启动编号,再把服务过滤和启动过滤组合起来。
官方地址:https://www.freedesktop.org/software/systemd/man/latest/journalctl.html
先分清服务过滤和启动过滤

-u(长选项是 --unit)按 systemd 单元筛选,适合锁定一个服务;-b(长选项是 --boot)按启动周期筛选,适合区分本次启动、上次启动或指定 boot ID。两个选项是不同维度,可以同时使用。
因此,不要把“没有看到日志”直接解释成“服务没有启动”。可能只是查了错误的启动周期,也可能是服务单元名或读取权限不对。

先列出可用的启动周期
查询历史启动前,先执行 --list-boots。它会列出相对启动编号、boot ID,以及该周期中第一条和最后一条日志的时间范围。相对编号通常以当前启动为 0,前一次为 -1,更早的周期继续递减。
# 先列出启动周期,确认 -1 对应哪次启动
journalctl --list-boots
# 只看当前启动周期的服务日志
journalctl --unit=nginx.service --boot=0 --no-pager
这里的 --boot=0 也可以写成只带 -b 的形式。显式写出 0 更适合脚本和排障记录,因为读者不需要猜这个参数指向哪一个周期。
用 -u 和 -b 组合查询服务
确认启动编号后,就可以用下面几组命令把范围固定下来:
# 当前启动:适合查看本次启动后服务是否产生过日志
journalctl -u nginx.service -b 0 --no-pager
# 上一次启动:适合对比重启前的异常
journalctl -u nginx.service -b -1 --no-pager
# 指定 boot ID:适合把查询记录保存到工单或复盘材料中
journalctl -u nginx.service -b 0123456789abcdef0123456789abcdef --no-pager
-u 可以多次指定,也可以使用匹配模式;如果只关心系统服务,保持默认的 system journal 即可。用户服务则应根据场景使用 --user 和对应的用户单元名。
再加时间范围和输出限制
启动周期解决“跨不跨重启”的问题,时间参数解决“这一周期内看哪一段”的问题。两者可以继续组合:
# 在上一次启动中,只查看凌晨 02:00 到 02:10 的服务日志
journalctl -u nginx.service -b -1 \
--since "02:00:00" --until "02:10:00" \
--no-pager
# 只取最近 50 条,便于把结果粘贴到排障记录中
journalctl -u nginx.service -b 0 -n 50 --no-pager
--since 和 --until 限制时间窗口,-n 限制条数,--no-pager 避免输出进入交互分页器。若需要更稳定地阅读时间,可加入 -o short-full 或 -o short-iso-precise,但不要把输出格式选项误当成筛选条件。

查询为空时按边界排查
| 现象 | 优先检查 | 判断方向 |
|---|---|---|
| 当前启动有日志,-b -1 为空 | --list-boots 的历史编号、日志是否持久化 | 旧周期可能已被清理,或只保存了运行期日志 |
| -u 查询为空 | systemd 单元名、是否为用户服务 | 服务名可能不是进程名,用户服务需要换查询范围 |
| 普通用户看不到系统日志 | systemd-journal、adm 或发行版对应的日志读取权限 | 先解决读取权限,再判断日志是否存在 |
| 时间范围和启动编号看起来矛盾 | 启动周期的起止时间与 --since/--until | 时间窗口不能超出目标周期的实际记录范围 |
systemd 官方手册说明,系统日志的读取范围还受用户权限影响;历史日志能否跨重启保留,则取决于 journald 的存储配置。查询为空时,先把“参数选错”和“数据确实不存在”分开。
一组可直接复用的速查组合
# 查看当前启动的指定服务
journalctl -u myapp.service -b 0 --no-pager
# 查看上一次启动的指定服务最近 100 条日志
journalctl -u myapp.service -b -1 -n 100 --no-pager
# 查看指定启动周期内的错误及更高优先级消息
journalctl -u myapp.service -b 0 -p err..emerg --no-pager
速查时可以记成三层:-u 决定服务,-b 决定启动周期,--since/--until/-n 决定范围大小。日志筛选只说明哪些记录符合条件,不能单独证明服务已经健康运行。
相关问题
journalctl -b 不带数字表示什么?
通常表示当前启动周期。为了让脚本和文档更明确,可以写成 -b 0。
为什么重启后查不到上一次启动的日志?
先检查 --list-boots 是否还有历史周期,再确认 journald 是否启用了持久化存储以及当前用户是否有读取权限。
服务名和进程名不一样怎么办?
-u 针对 systemd 单元名,不是任意进程名。应先从服务定义或 systemctl 的单元列表确认准确名称。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
214 收藏
-
207 收藏
-
320 收藏
-
327 收藏
-
380 收藏
-
449 收藏
-
360 收藏
-
415 收藏
-
199 收藏
-
367 收藏
-
399 收藏
-
290 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习