使用 journalctl 的 --output=json 选项可输出结构化 JSON 日志,每行一个 JSON 对象(JSON Lines 格式),支持按服务、数量、时间等过滤,并可用 jq 美化或提取字段;含二进制内容的字段可能被省略或置为 null,推荐结合 jq 过滤关键字段后导出为 .jsonl 文件供后续分析。

使用 journalctl 的 --output=json 选项即可将日志以结构化 JSON 格式输出。
基础用法:直接输出 JSON
每条日志作为一行独立的 JSON 对象(JSON Lines 格式),适合脚本解析:
-
journalctl --output=json—— 输出全部日志,每行一个 JSON 对象 -
journalctl -u nginx --output=json—— 仅输出 nginx 服务的日志,JSON 格式 -
journalctl -n 10 --output=json—— 输出最新 10 条日志,JSON 格式
增强可读性:美化 JSON 输出
默认是紧凑单行 JSON,如需缩进查看,可用 jq 格式化:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
-
journalctl -n 5 --output=json | jq '.'—— 输出最近 5 条并美化显示 -
journalctl -u ssh --since "2024-01-01" --output=json | jq -r '.MESSAGE'—— 提取所有 MESSAGE 字段值
注意字段完整性与二进制内容
JSON 输出包含完整字段(如 __REALTIME_TIMESTAMP、_PID、SYSLOG_IDENTIFIER 等),但部分字段可能含不可见字符或二进制数据:
- 含非 UTF-8 字节的字段(如某些内核日志)会被自动省略或转为 null,避免解析失败
- 如需保留原始字节,可加
--all并配合--output=json-pretty(部分 systemd 版本支持),但更推荐用--output=json+jq过滤关键字段
导出到文件并后续处理
保存为 JSON Lines 文件便于批量分析:
journalctl --since "1 hour ago" --output=json > recent.jsonl- 之后可用 Python、jq 或 logstash 直接按行读取解析,每行是一个合法 JSON 对象










