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

Linux 怎样按启动轮次筛选 systemd 日志

来源:17golang原创

时间:2026-10-18 02:16:50 465浏览 收藏

排查 Linux 重启前后的问题时,先不要在整本 journal 里翻滚动输出。更稳的做法是先用 journalctl --list-boots 看清每一轮启动的相对编号、BOOT_ID 和时间范围,再用 -b 选中目标轮次,最后叠加 --since 与 --until 限定故障窗口。

官方地址:https://www.freedesktop.org/software/systemd/man/latest/journalctl.html

最常用的组合是 journalctl --list-boots 负责确认轮次,journalctl -b -1 负责读取上一轮启动;如果还知道故障发生时间,就在同一个命令上加 --since 和 --until。相对编号只对当前可见的启动记录有意义,长期保存上一轮日志还取决于 journald 的持久化配置。

先把启动轮次列出来

--list-boots 会以表格列出启动编号、启动 ID,以及该轮第一条和最后一条消息的时间。它的价值不是直接给出故障原因,而是先回答“上一轮到底是哪一轮、日志覆盖到什么时候”。

# 先列出当前 journal 中可见的启动轮次和时间范围
journalctl --list-boots

# 只查看最近几条轮次,便于快速确认当前启动附近的记录
journalctl --list-boots -n 5

输出中的 0 通常表示当前启动,-1 表示紧邻当前启动的上一轮,-2 表示再上一轮。这里的编号是相对编号,不是永久不变的主键;日志被轮换、清理或查询了另一台机器的目录后,可见范围会变化。

journalctl 启动轮次、BOOT_ID 与日志文件之间的静态关系图
图1:启动轮次识别与 systemd 日志存储的静态说明图,不是终端截图或运行证据。

用 -b 选择当前、上一轮或指定 ID

确认轮次后,使用 -b 读取对应启动的消息。空参数或 -b 0 面向当前启动,-b -1 面向上一轮;也可以把 --list-boots 中的 32 位 BOOT_ID 直接交给 --boot=,减少相对编号在记录变化后的歧义。

# 读取当前启动的全部可见日志
journalctl -b 0

# 读取上一轮启动;负数从当前可见记录向前数
journalctl -b -1

# 使用明确的 BOOT_ID,避免只凭相对编号猜测目标轮次
journalctl --boot=替换为32位BOOT_ID

如果只想看内核消息,可以在轮次选择后加 -k;如果只关心某个服务,可以再加 -u 服务名.service。这些条件是在同一份 journal 上继续缩小结果,不会改变 -b 对启动轮次的选择。

给目标轮次加上时间边界

--since 是起始时间,--until 是结束时间。二者可以写成可读的时间表达式,例如 today、yesterday、2026-10-18 01:20:00;为了复盘固定故障,使用完整日期和时分秒更容易把排查结果交给其他人复现。

# 在上一轮启动中,只看一个明确的故障时间窗口
journalctl -b -1 --since "2026-10-17 23:10:00" --until "2026-10-17 23:30:00"

# 在指定轮次中只看某个服务,先按轮次再按时间和服务缩小范围
journalctl -b -1 -u nginx.service --since "10 minutes ago" --until "now"

时间边界只负责限制消息时间,不会替你选择启动轮次。比如当前启动已经跨过午夜,直接使用 --since today 可能把结果限制在今天,而你真正要找的故障发生在上一轮的昨天;这时应先写清 -b -1,再决定时间表达式属于哪一天。

journalctl 用启动轮次和 since until 时间范围共同筛选日志的静态关系图
图2:启动轮次与时间范围共同限定日志记录的静态说明图,不是执行流程截图。

把过滤条件组合成可复用命令

实际排障时,可以按“轮次、服务、级别、时间”这个顺序组织命令。这样读者接手命令时,先能看出日志属于哪一次启动,再知道为什么结果只剩一个时间窗口。

# 上一轮启动中筛选指定服务和错误级别,并限定故障窗口
journalctl -b -1 -u nginx.service -p err \
  --since "2026-10-17 23:10:00" \
  --until "2026-10-17 23:30:00"

# 仅筛选上一轮的内核消息,适合查看启动阶段的驱动或磁盘线索
journalctl -k -b -1 --since "2026-10-17 23:00:00" --until "2026-10-17 23:20:00"

如果权限不足,先确认当前用户是否能读取系统 journal;在发行版默认限制较严时,可以在明确需要的情况下使用 sudo。不要为了“看全”而长期把命令写成无边界的全量输出,先缩小轮次和时间通常更快。

遇到空结果时检查这几个边界

  • 上一轮不存在:--list-boots 只显示当前 journal 中保留下来的记录,-b -1 没有匹配项时不能凭空恢复旧日志。
  • 日志没有跨重启保存:如果系统只把 journal 放在易失位置,重启后上一轮可能已经不可见;这不是 -b 语法问题。
  • 时间窗口写错日期:相对时间表达式依赖执行时刻,复盘和交接时优先使用带日期的完整时间。
  • 编号理解反了:负数从当前启动向前查,正数表示从日志中最早可见的启动方向计数;需要确认时,重新查看 --list-boots。
  • 服务名写错:先用正确的 unit 名称,再叠加 -u;否则会把“服务过滤无结果”误认为“该轮没有日志”。

速查表

目标命令说明
列出启动轮次journalctl --list-boots查看相对编号、BOOT_ID 和时间范围
当前启动journalctl -b 0选择当前可见的启动轮次
上一轮启动journalctl -b -1从当前启动向前选择一轮
固定时间范围--since ... --until ...在选中的轮次中缩小消息时间

记住一个简单顺序:先用 --list-boots 认轮次,再用 -b 选轮次,最后用 --since/--until 限定时间。如果结果为空,优先回到轮次表和日志保留策略检查,而不是反复改写同一个过滤参数。

相关问题

journalctl -b -1 为什么看不到上一轮?

先运行 journalctl --list-boots。如果列表里没有负数对应的轮次,通常是旧日志没有保留、journal 被清理,或者当前查询目录不是目标主机的日志目录。

BOOT_ID 比 -1 更可靠吗?

BOOT_ID 能明确指向一轮启动,适合交接和脚本记录;-1 更适合临时查看最近一次重启。两者都受当前可见 journal 数据范围影响。

--since 和 --until 能单独使用吗?

可以。单独使用 --since 表示从起点开始,单独使用 --until 表示查看到终点;排查跨重启问题时,建议显式同时写出轮次和时间边界。

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