journal 导出 JSON 是什么
journalctl 默认输出给人看的时间戳加消息文本,但做统计、聚合、接告警时更需要结构化数据。加 -o json 会把每条日志输出成一行 JSON,字段包括优先级 PRIORITY、消息 MESSAGE、单元 UNIT、进程号 _PID、日志标识 SYSLOG_IDENTIFIER 等;再用 jq 过滤与聚合,就能按服务、级别、时间段精确筛选,比用文本搜索可靠得多。-o json-pretty 是同一份数据的美化版本,适合人看。
基本信息
| 适用平台 | 使用 systemd 的 GNU/Linux(journalctl 配合 jq) |
|---|---|
| 语法 | journalctl -o json 管道交给 jq 处理 |
| 输出格式 | json 单行、json-pretty 缩进美化、short-iso 传统文本 |
| 常用过滤 | -u 单元、--since 起始时间、-n 条数、-p 级别 |
| 关键字段 | PRIORITY 优先级、MESSAGE 消息、UNIT 单元、_PID 进程号 |
| 数据类型 | PRIORITY 在 JSON 中是字符串而非数字 |
典型使用场景
- 按服务与级别精确筛选错误日志,导出清单做趋势统计。
- 把日志接入数据管道或告警系统,需要稳定字段而不是文本行。
- 统计某服务在一段时间内各优先级的数量分布。
- 抽取进程号、单元等字段做关联分析。
- 排查特定链路时按时间范围提取原始消息。
常用写法
常用写法
journalctl -u myapp -n 100 -o json-pretty | head -60 # 人看的美化输出
journalctl -u myapp -n 50 -o json | jq -r '[.PRIORITY, .MESSAGE] | @tsv' | head
journalctl -u myapp --since today -o json | jq -r 'select((.PRIORITY|tonumber)<=4) | .MESSAGE' | head
journalctl -u myapp -o json | jq -r '.PRIORITY' | sort | uniq -c | sort -rn # 级别分布
journalctl -u sshd -n 20 -o short-iso # 需要人读时用短格式
journalctl --since '2026-10-13 09:00' --until '2026-10-13 10:00' -o json | wc -l
journalctl -u myapp -o json --no-pager | jq -r '[._PID, .MESSAGE] | @tsv' | head选项与字段读法
| 选项或字段 | 作用 | 使用要点 |
|---|---|---|
| -o json | 单行 JSON 输出 | 适合管道交给 jq 处理 |
| -o json-pretty | 缩进美化输出 | 体积膨胀数倍,只适合小批量查看 |
| -o short-iso | 文本加 ISO 时间戳 | 人读友好,不建议做脚本解析 |
| -u 单元 | 限定服务 | 排查单个服务时必加 |
| PRIORITY | 优先级字段 | 在 JSON 里是字符串,比较前要转数字 |
| _PID 与 UNIT | 进程与单元元数据 | 接入管道前先裁剪,控制体积 |
jq 里 PRIORITY 是字符串,直接做数值比较会按字典序判断而得出错误结果;先转换数字再比大小,例如筛选错误及以上级别的日志。
json-pretty 的输出体积是单行 JSON 的数倍,大批量导出用单行格式在下游格式化;同时加上禁用分页的参数,避免输出被分页器接管导致脚本卡住。
每条日志包含大量元数据字段,直接写进日志平台会明显放大存储与索引成本;接入前裁剪成真正需要的几个字段。