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

journalctl 按启动会话筛选并导出日志

来源:17golang原创

时间:2026-09-29 03:49:04 369浏览 收藏

排查一次重启后的服务异常时,先别把整本 journal 全量导出。更稳的做法是先用 journalctl --list-boots --no-pager 找到目标启动,再用 -b 锁定会话,最后根据用途选择人读文本或结构化格式保存。

官方手册:https://www.freedesktop.org/software/systemd/man/255/journalctl.html

要点速览
  • --list-boots 给出相对编号、Boot ID 和首末时间,先定位再过滤。
  • -b -1 表示上一次启动;跨机器或长期归档时优先记录完整 Boot ID。
  • -o short-full 适合人工阅读,-o export 适合保留结构化日志记录。

先用 --list-boots 找到要调查的启动会话

启动编号是相对当前日志集合的定位方式,不是永久不变的主键。先执行下面的命令,重点看三列:相对启动编号、32 位 Boot ID,以及该次启动的第一条和最后一条日志时间。

# 关闭分页,便于把启动列表保存到工单或文件
journalctl --list-boots --no-pager

# 只看最近三次启动,避免列表过长
journalctl --list-boots -n 3 --no-pager

示例输出只用于说明字段关系,数字不代表本文作者机器的真实结果:

-2  4c2d...9a10  Mon 2026-09-28 08:10:03 CST—Mon 2026-09-28 18:41:22 CST
-1  7a91...d4e2  Tue 2026-09-29 07:52:10 CST—Tue 2026-09-29 09:06:18 CST
 0  b6f0...aa31  Tue 2026-09-29 09:06:29 CST—Tue 2026-09-29 10:15:02 CST
journalctl --list-boots 展示启动编号、Boot ID 与时间范围并选择目标启动的结构说明图
图1:启动会话定位说明图,展示 --list-boots 与 -b 的选择关系;这是原创静态说明图,不是截图。

用 -b 偏移或完整 Boot ID 筛选目标会话

确定目标后,-b 可以接相对偏移,也可以接完整 Boot ID。空的 -b 默认看当前启动,-b -1 看上一次启动,-b -2 再向前一轮。若调查材料要跨机器传递,建议把列表中的完整 ID 一并记录,避免“第 2 次启动”在另一台机器上产生歧义。

# 查看当前启动的内核与系统日志,-k 只保留内核消息
journalctl -b -k --no-pager

# 查看上一次启动,并按服务单元继续收窄
journalctl -b -1 -u ssh.service --no-pager

# 用完整 Boot ID 锁定会话;ID 必须替换为 --list-boots 得到的真实值
journalctl -b 7a91...d4e2 --no-pager

多个条件通常是同时成立的:启动会话、服务单元、优先级或时间范围会共同收窄结果。不要先用模糊的文本管道替代这些字段过滤,否则容易把相邻启动的同名服务混进来。

按用途选择日志导出格式

人工复盘与机器归档不是同一种输出需求。人读时应保留完整时间、时区和消息;交给后续工具或需要尽量保留字段时,可以使用 Journal Export Format。导出前加 --no-pager,避免 less 接管输出;跨时区协作时可加 --utc。

目标命令要点适合场景
人工阅读-o short-full工单、复盘、按时间对照
结构化保存-o export保留字段、交给解析工具
限制范围-b + -u/-p只看一次启动中的服务或级别
# 导出上一次启动的人读日志;重定向文件由当前 shell 创建
journalctl -b -1 -o short-full --no-pager --utc > boot-previous.log

# 导出同一会话的 Journal Export Format,保留结构化字段
journalctl -b -1 -o export --no-pager > boot-previous.export
journalctl 按启动会话过滤后分流到 short-full 人读文本和 export 结构化归档的说明图
图2:日志导出格式说明图,展示人读文本与结构化导出的选择;这是原创静态说明图,不是运行证据。

权限、持久化和旧启动缺失的排查边界

如果普通用户只能看到自己的日志,先确认是否有读取系统 journal 的权限;临时处理可以使用 sudo journalctl ...,长期则按发行版的日志访问组和最小权限策略配置。权限不足与“没有这次启动的日志”是两类问题,不要混在一起判断。

列表里没有更早的启动,可能是日志只保存在运行时目录、旧文件已轮转清理,或当前查询的目录不是目标机器。此时先检查 journald 的持久化配置和保留策略,再决定是否能恢复;单纯把 -b -2 改成别的数字不能创造已经被删除的记录。

常见问题:为什么 -b -1 找到的不是我以为的那次重启?

-1 是当前查询日志集合中的上一启动,不是按业务事件命名的“上周重启”。先看 --list-boots 的时间范围,再用完整 Boot ID 固定证据。

常见问题:导出的文件为什么看起来没有换行或字段很多?

export 面向结构化记录,不等同于普通文本日志。人工阅读请选择 short-full;需要解析字段时再保留 export,不要用文本格式猜字段边界。

常见问题:能否只导出某个时间段?

可以在启动条件上叠加 --since 和 --until。先锁定 -b,再加时间范围,才能避免同一时刻相邻启动的记录混入。

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