登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

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

先分清服务过滤和启动过滤

图1:journalctl-boot-fields
图1:journalctl-boot-fields

-u(长选项是 --unit)按 systemd 单元筛选,适合锁定一个服务;-b(长选项是 --boot)按启动周期筛选,适合区分本次启动、上次启动或指定 boot ID。两个选项是不同维度,可以同时使用。

因此,不要把“没有看到日志”直接解释成“服务没有启动”。可能只是查了错误的启动周期,也可能是服务单元名或读取权限不对。

journalctl 按服务单元和启动周期组合筛选日志的静态结构图
图1:操作示意图,展示服务单元、启动周期和日志记录三个边界;这是静态说明图,不是终端截图。

先列出可用的启动周期

查询历史启动前,先执行 --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,但不要把输出格式选项误当成筛选条件。

journalctl 查询结果中时间、服务单元、启动 ID 与日志正文的静态关系图
图2:结果示意图,展示时间字段、服务单元、启动 ID 与消息正文的静态关系;它用于理解字段,不代表某台机器的实际输出。

查询为空时按边界排查

现象优先检查判断方向
当前启动有日志,-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 的单元列表确认准确名称。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>