从一条排障命令开始,系统掌握 `journalctl`

张开发
2026/4/20 6:49:24 15 分钟阅读

分享文章

从一条排障命令开始,系统掌握 `journalctl`
一、先把你这条命令拆开journalctl-umail-doc-parser--since30 min ago--no-pager\|grep-E翻译失败|摘要失败|翻译摘要失败|处理失败|vLLM|finish_reason|截断|timeout|deadline|connection|EOF它的含义可以逐段理解1-u mail-doc-parser按 systemd unit 过滤只看mail-doc-parser这个服务相关的日志。-u/--unit会为指定 unit 添加一组匹配条件不只是简单匹配_SYSTEMD_UNIT...还会把与该 unit 相关的 systemd 消息、coredump 相关消息一并纳入。(Ubuntu Manpages)2--since 30 min ago只看最近 30 分钟。--since/--until支持绝对时间也支持yesterday、today、now以及-30min、2h这类相对时间表达。(Ubuntu Manpages)3--no-pager不通过less分页器输出直接把结果打到标准输出。这个选项在脚本、管道、重定向里很常用。(Ubuntu Manpages)4| grep -E ...把journalctl输出再交给grep -E做正则筛选。这里的-E是扩展正则a|b|c表示“匹配 a 或 b 或 c”。这类写法的优点是兼容性好老版本 systemd 也能用。因为journalctl自带的--grep/-g是后加入的且只针对MESSAGE字段做 PCRE 正则匹配。(Ubuntu Manpages)二、你的命令还能怎么改得更适合生产排障方案 A保留外部grep兼容性最好journalctl-umail-doc-parser--since30 min ago--no-pager\|grep-E翻译失败|摘要失败|翻译摘要失败|处理失败|vLLM|finish_reason|截断|timeout|deadline|connection|EOF适合机器环境复杂、systemd 版本不统一的时候。方案 B改用journalctl --grepjournalctl-umail-doc-parser\--since30 min ago\--grep翻译失败|摘要失败|翻译摘要失败|处理失败|vLLM|finish_reason|截断|timeout|deadline|connection|EOF\--no-pager优点是过滤发生在journalctl内部更干净但要注意--grep匹配的是日志的MESSAGE字段不是整行格式化输出而且它是较新的选项。(Ubuntu Manpages)方案 C只看错误等级再叠加关键字journalctl-umail-doc-parser\--since30 min ago\-perr..alert\--no-pager\|grep-E翻译失败|摘要失败|timeout|deadline|connection|EOF-p/--priority支持单级别也支持范围如err..alert、warning..crit。(Ubuntu Manpages)方案 D实时追踪journalctl-umail-doc-parser-f--no-pager-f/--follow会持续跟踪新日志类似tail -f。(Ubuntu Manpages)再叠加关键字筛选journalctl-umail-doc-parser-f--no-pager\|grep-E翻译失败|摘要失败|timeout|deadline|EOF这非常适合你这种“文档解析 翻译 摘要 vLLM 推理”链路的在线观察。三、journalctl最核心的查询维度下面按“排障时最常用的思路”来讲。1. 按服务查journalctl-unginx journalctl-udockerjournalctl-umail-doc-parser journalctl-umail-*-u/--unit支持 unit也支持 pattern。pattern 会和 journal 里已有的 unit 名称列表进行匹配。(Ubuntu Manpages)2. 按时间查journalctl--since2026-04-19 09:00:00journalctl--until2026-04-19 10:00:00journalctl--since1 hour agojournalctl--sincetoday journalctl--sinceyesterday--untiltoday这是定位“某次发布后”“某次重启后”“某个用户反馈时间点附近”问题的第一步。官方说明里--since/--until支持完整时间、只写日期、只写时分秒以及today/yesterday/now/ 相对时间。(Ubuntu Manpages)3. 按启动批次查journalctl-bjournalctl-b-1journalctl-b-2journalctl --list-boots-b看当前启动周期-b -1看上一次开机--list-boots列出所有可见启动记录。这个对排查“重启前正常、重启后异常”特别有用。(Ubuntu Manpages)4. 按优先级查journalctl-perr journalctl-pwarning..crit journalctl-umail-doc-parser-perr..alert优先级支持数值0~7也支持文本级别emerg、alert、crit、err、warning、notice、info、debug。单个级别表示“该级别及更严重”范围表示区间。(Ubuntu Manpages)5. 按标识符查journalctl-tsshd journalctl-tuvicorn journalctl-tpython-t/--identifier按SYSLOG_IDENTIFIER过滤。很多程序没有规范 unit但会带上稳定的 identifier这时很好用。(Ubuntu Manpages)6. 按内核日志查journalctl-kjournalctl-k-b-1-k/--dmesg只看 kernel 消息并隐含当前 boot 匹配。排查驱动、磁盘、网络、OOM、内核告警时很常用。(Ubuntu Manpages)四、真正强大的地方按字段过滤journalctl不只是“看文本日志”它本质上是在查结构化日志。官方明确说明匹配表达式格式是FIELDVALUE多个不同字段默认是逻辑 AND。(Ubuntu Manpages)1. 最基础的字段过滤journalctl_SYSTEMD_UNITmail-doc-parser.service journalctl_PID12345journalctlPRIORITY32. 多字段组合ANDjournalctl_SYSTEMD_UNITmail-doc-parser.service_PID12345只有同时满足两个条件的日志才会出来。官方示例就是不同字段组合为 AND。(Ubuntu Manpages)3. 同字段多值ORjournalctl_SYSTEMD_UNITmail-doc-parser.service_SYSTEMD_UNITnginx.service同一个字段多次出现时是 OR 关系。(Ubuntu Manpages)4. 用做分组 ORjournalctl_SYSTEMD_UNITmail-doc-parser.service_PID12345_SYSTEMD_UNITnginx.service表示“左边这组条件”或“右边这组条件”。官方示例里明确给了作为逻辑 OR 分隔符。(Ubuntu Manpages)5. 常见字段你可以这样理解常用字段一般包括_SYSTEMD_UNIT服务 unit 名_PID进程号PRIORITY日志级别MESSAGE日志正文SYSLOG_IDENTIFIER标识符其中-u、-p、-t、--grep本质上都是在帮你构造这些字段上的过滤条件。官方文档对-u、-p、-t、--grep的行为都有明确说明。(Ubuntu Manpages)五、最常用的输出控制方式很多人会查日志但不会“把日志变成适合人看、适合脚本处理、适合排障归档的格式”。1. 默认短格式journalctl-umail-doc-parser默认输出模式是short看起来接近传统 syslog一行一条。(Ubuntu Manpages)2. 更完整时间格式journalctl-umail-doc-parser-oshort-full journalctl-umail-doc-parser-oshort-iso journalctl-umail-doc-parser-oshort-preciseshort-full的时间格式和--since/--until可接受的格式接近short-iso是 ISO/RFC3339 风格short-precise更细。(Ubuntu Manpages)3. 只输出正文journalctl-umail-doc-parser-ocat-o cat只显示MESSAGE不带时间戳、主机名等元数据。适合再接grep、awk、sed。(Ubuntu Manpages)4. JSON 输出适合程序处理journalctl-umail-doc-parser-ojson journalctl-umail-doc-parser-ojson-pretty官方支持json、json-pretty、json-sse、json-seq等格式。(Ubuntu Manpages)比如你要做自动分析journalctl-umail-doc-parser--since1 hour ago-ojson5. 只输出指定字段journalctl-umail-doc-parser-ojson --output-fieldsMESSAGE,PRIORITY,_PID,_SYSTEMD_UNIT--output-fields对verbose、export、json*以及cat模式有效。(Ubuntu Manpages)6. 不分页、静默、UTCjournalctl-umail-doc-parser --no-pager journalctl-umail-doc-parser-qjournalctl-umail-doc-parser--utc-q会隐藏“Journal begins at…”、“Reboot --”之类提示--utc用 UTC 时间显示。(Ubuntu Manpages)六、日志条数与方向控制1. 只看最后 N 行journalctl-umail-doc-parser-n50journalctl-umail-doc-parser-n200--no-pager-n/--lines默认是最近 10 条。(Ubuntu Manpages)2. 倒序显示journalctl-umail-doc-parser-r新日志在前。(Ubuntu Manpages)3. 跟踪模式不截尾journalctl-umail-doc-parser-f--no-tail默认-f只从尾部开始看--no-tail可以让它把已有记录也一起带出来。(Ubuntu Manpages)七、用户日志、系统日志、远端日志1. 系统日志 vs 用户日志journalctl--systemjournalctl--user--system看系统服务和内核日志--user看当前用户服务日志如果都不写就显示当前用户可见的日志。(Ubuntu Manpages)2. 指定 journal 目录journalctl--directory/var/log/journal journalctl--directory/var/log/journal/remote可以直接查指定目录下的 journal 文件。(Ubuntu Manpages)3. 指定 journal 文件journalctl--file/var/log/journal/xxx/system.journal适合拿到某台机器的 journal 文件后离线分析。(Ubuntu Manpages)4. 合并多来源journalctl-m-m/--merge可以把所有可用日志交织显示包括远端日志。(Ubuntu Manpages)八、你在线上最该背下来的journalctl组合拳下面这些基本就是运维/开发排障的“日常兵器库”。1. 看服务最近 100 行journalctl-umail-doc-parser-n100--no-pager2. 看服务最近 30 分钟journalctl-umail-doc-parser--since30 min ago--no-pager3. 看服务错误日志journalctl-umail-doc-parser-perr..alert--since2 hours ago--no-pager4. 实时跟踪服务journalctl-umail-doc-parser-f5. 查看上一次重启后的该服务日志journalctl-umail-doc-parser-b-1--no-pager6. 查看本次启动期间的内核错误journalctl-k-perr..alert-b--no-pager7. 只抓关键报错词journalctl-umail-doc-parser--since1 hour ago--no-pager\|grep-Etimeout|deadline|connection|EOF|OOM|killed8. 输出为 JSON 交给脚本journalctl-umail-doc-parser--since1 hour ago-ojson九、grep和journalctl --grep到底该怎么选这个问题很实战。用外部grep的时候journalctl-umail-doc-parser--since30 min ago--no-pager|grep-Etimeout|EOF优点老系统也能跑你可以继续串awk、sed、wc -l对 shell 用户最顺手缺点它匹配的是格式化输出文本不是 journal 原始字段如果输出模式改了匹配结果可能跟着变用journalctl --grep的时候journalctl-umail-doc-parser--since30 min ago--greptimeout|EOF--no-pager优点直接在日志正文MESSAGE上匹配过滤更“结构化”不必再多开一个grep进程缺点版本要求更高只匹配MESSAGE不是所有展示文本官方文档明确指出--grep过滤的是MESSAGE字段并使用 PCRE当模式全小写时默认大小写不敏感否则区分大小写也可用--case-sensitive控制。(Ubuntu Manpages)我的建议很简单做兼容性优先的生产脚本用journalctl ... | grep -E做结构化、干净的单机排障优先试journalctl --grep十、日志容量、归档和清理很多机器不是“不会查”而是“journal 占盘太大”。1. 看 journal 占用journalctl --disk-usage会显示当前所有 journal 文件占用的磁盘空间。(Ubuntu Manpages)2. 按时间清理旧归档sudojournalctl --vacuum-time7dayssudojournalctl --vacuum-time1months3. 按大小清理sudojournalctl --vacuum-size1Gsudojournalctl --vacuum-size500M4. 按文件个数清理sudojournalctl --vacuum-files10这些vacuum操作只针对已归档的 journal 文件不直接处理当前活跃文件它们也可以和--rotate组合先滚动、再清理。(Ubuntu Manpages)十一、校验、同步、游标这些进阶用法1. 校验 journal 完整性journalctl--verify可以检查 journal 文件内部一致性如果启用了 FSS还可以结合校验键验证真实性。(Ubuntu Manpages)2. 强制落盘同步journalctl--sync这会要求 journald 把尚未写入的数据刷到磁盘命令直到同步完成才返回。(Ubuntu Manpages)3. 查看游标journalctl-umail-doc-parser-n20--show-cursor输出最后会带一个 cursor可用于断点续读。(Ubuntu Manpages)4. 基于游标续读journalctl --after-cursors0639...journalctl --cursor-file/tmp/mail-doc-parser.cursor--cursor-file很适合脚本定时读取新增日志。(Ubuntu Manpages)十二、适合mail-doc-parser的一套排障命令模板你这个服务明显有“文档解析、翻译、摘要、模型调用、网络请求、超时”的特征我给你一套更贴近实际的组合。1. 看最近 30 分钟所有异常关键词journalctl-umail-doc-parser--since30 min ago--no-pager\|grep-E翻译失败|摘要失败|翻译摘要失败|处理失败|vLLM|finish_reason|截断|timeout|deadline|connection|EOF2. 只看错误等级再抓链路关键词journalctl-umail-doc-parser--since30 min ago-perr..alert --no-pager\|grep-E翻译|摘要|vLLM|timeout|deadline|EOF3. 实时盯住推理与超时问题journalctl-umail-doc-parser-f--no-pager\|grep-EvLLM|finish_reason|timeout|deadline|connection|EOF4. 导出为 JSON 给程序二次分析journalctl-umail-doc-parser--since2 hours ago-ojsonmail-doc-parser.jsonl5. 对比本次启动与上次启动journalctl-umail-doc-parser-b--no-pager journalctl-umail-doc-parser-b-1--no-pager如果上次正常、这次异常往往就是配置、依赖、模型路径、网络环境或者发布差异。十三、线上使用journalctl的几个经验1. 先缩小范围再放大范围不要上来就journalctl先按服务、按时间、按级别切小范围journalctl-umail-doc-parser--since20 min ago-pwarning..alert --no-pager2. 能用-u就先用-u因为 unit 是 systemd 场景下最稳定的过滤入口之一。官方也明确说明了-u会扩展成一组更复杂、更完整的匹配条件而不是单字段文本过滤。(Ubuntu Manpages)3. 脚本里一定加--no-pager否则结果可能被分页器接管脚本行为会变得不稳定。(Ubuntu Manpages)4. 想做自动化分析优先-o json不要依赖肉眼格式切字段直接上 JSON 更稳。官方也说明了json输出及其编码规则。(Ubuntu Manpages)5. 注意发行版差异像--grep、--output-fields、--truncate-newline这类功能是在不同 systemd 版本逐步加入的如果你机器版本偏老外部grep往往更稳妥。(Ubuntu Manpages)十四、一份可直接收藏的journalctl速查表# 查看全部可见日志journalctl# 查看某服务日志journalctl-umail-doc-parser# 查看最近 100 行journalctl-umail-doc-parser-n100# 实时跟踪journalctl-umail-doc-parser-f# 最近 30 分钟journalctl-umail-doc-parser--since30 min ago# 指定时间区间journalctl-umail-doc-parser--since2026-04-19 09:00:00--until2026-04-19 10:00:00# 查看错误及以上journalctl-umail-doc-parser-perr..alert# 查看当前启动周期journalctl-b# 查看上一次启动周期journalctl-b-1# 查看内核日志journalctl-k# 查看用户日志journalctl--user# 不分页输出journalctl --no-pager# 倒序输出journalctl-r# JSON 输出journalctl-ojson# 只输出正文journalctl-ocat# 显示游标journalctl --show-cursor# 查看 journal 占盘journalctl --disk-usage# 清理 7 天前归档sudojournalctl --vacuum-time7days# 清理到 1G 以内sudojournalctl --vacuum-size1G# 校验 journaljournalctl--verify# 强制刷盘journalctl--sync结语如果把grep看成“在文本里捞针”那journalctl更像“先按仓库、时间、货架、标签把范围缩小再去捞针”。你那条命令已经很接近生产级排障写法了。再往前一步就是形成固定套路先按-u锁服务再按--since/--until缩时间再按-p看等级再决定用grep还是--grep抓关键词需要自动化就改成-o json这样查日志速度会非常快而且不容易漏掉关键线索。

更多文章