JSON 行日志怎么解析
现代应用与云服务常以 JSON Lines 输出日志:一行一个 JSON 对象,字段结构清晰,适合用工具按字段筛选与聚合,比按列号切分文本可靠得多。处理流程一般是三步:先抽样看结构(字段名、嵌套层级、时间字段格式),再按字段做过滤与聚合,最后把结果导出成表格或交给时间线工具。前提是确认字段命名在时间范围内保持稳定,否则聚合结果会因字段变更而错位。
基本信息
| 适用平台 | Linux 与 Windows 命令行环境(jq、awk、python 等可用即可) |
|---|---|
| 常用工具 | jq(首选,支持嵌套字段与聚合)、awk(字段简单时)、python(复杂逻辑) |
| 压缩文件 | gzip 日志可先用 zcat/zgrep 解压后管道处理,避免落地中间文件 |
| 字段探查 | head -1 后接 jq . 查看结构;嵌套字段用 .a.b 引用 |
| 质量检查 | 对比总行数与可解析行数,评估数据完整性 |
典型使用场景
- 按用户、来源 IP 或动作聚合访问行为,快速找出异常主体
- 在超大日志中按时间窗与方法组合筛出可疑记录
- 把嵌套结构(请求对象中的字段)展开成表格,便于统计
- 提取特定字段交给时间线工具,避免人工翻找全文
- 校验日志质量:确认字段是否存在、类型是否一致、是否有坏行
jq 处理示例
jq 处理示例
# 先看结构:第一条记录的字段与层级
zcat app.jsonl.gz | head -1 | jq .
# 取需要的字段并聚合
zcat app.jsonl.gz | jq -r '[.ts,.user,.action,.src_ip]|@tsv' | sort | uniq -c | sort -rn | head -20
# 嵌套字段与缺省值处理(字段缺失不影响输出)
jq -r '[.ts, .user.id // "unknown", .request.method // "-", .status]|@tsv' app.jsonl | head
# 按时间与条件筛选
jq -c 'select(.ts >= "2026-10-12T00:00:00Z" and .status == 404)' app.jsonl | head
# 统计各字段取值分布,发现异常取值
jq -r '.action' app.jsonl | sort | uniq -c | sort -rn | head常见问题对照
| 现象 | 原因 | 处理方式 |
|---|---|---|
| 聚合结果整体错位 | 字段名或结构随版本变更 | 先分时间窗抽样,确认字段一致性 |
| 个别行解析报错 | 混入了非 JSON 行(启动横幅、错误输出) | 先统计行数差异,筛掉坏行再解析 |
| 嵌套字段取不到 | 层级写错或字段在不同版本深度不同 | 用 jq . 抽样确认路径后再写查询 |
| 数值与字符串混用 | 同一字段在不同记录中类型不同 | 统一用字符串比较或先做类型转换 |
| 处理速度极慢 | 在超大文件上做全量解析 | 先用时间或关键字粗筛后再精细解析 |
先抽查字段命名是否随时间变过,再全量聚合;字段改名的日志跨版本处理时会静默丢数据,这是最容易出错的环节。
处理前先备份原始日志文件并记录哈希,解析产物与原始数据分开存放,避免把处理后的结果当作原始证据引用。