日志解析成结构化事实
日志入仓要先把半结构化日志(JSON、键值对、定长文本)解析成结构化列,同时保留原始定位信息:文件路径加偏移量,或对象存储的 key 加 offset。解析规则必须版本化登记。这样当规则写错或上游新增字段时,可以回到原始日志重新解析,不必等上游重发数据。
基本信息
| 解析方式 | JSON 提取、正则捕获、分隔符切分 |
|---|---|
| 原始定位 | src_path + src_offset 或对象键 + offset |
| 规则版本 | 解析规则编号,标注生效时间与变更内容 |
| 失败处理 | 解析失败与字段缺失单列监控,不静默丢弃 |
| 分区方式 | 按日志生成日期 dt 分区 |
| 常见函数 | Hive 的 get_json_object / regexp_extract |
典型使用场景
- 应用埋点入仓:把 JSON 日志解析成行为事实表供漏斗分析
- 网关访问日志:解析出状态码、耗时、上游地址做稳定性统计
- 设备上报日志:解析物联网设备的周期上报,构造状态事实
- 规则迭代回溯:解析规则升级后对历史日志重新解析补齐字段
- 问题定位:借助原始指针回到具体文件与偏移,复核解析结果
JSON 解析与失败监控
JSON 解析与失败监控
SELECT
get_json_object(log, '$.order_id') AS order_id,
get_json_object(log, '$.amount') AS amount,
get_json_object(log, '$.event_type') AS event_type,
src_path,
src_offset, -- 原始指针,用于回溯复核
rule_version
FROM ods_app_log
WHERE dt = '2026-10-12';
SELECT count(1) AS bad_rows -- 解析失败的行单独监控,不静默丢弃
FROM ods_app_log
WHERE dt = '2026-10-12' AND get_json_object(log, '$.order_id') IS NULL;解析入仓要点
| 环节 | 做法 | 出错表现 |
|---|---|---|
| 解析 | 按规则提取字段并保留原始指针 | 无法回溯,只能等上游重发 |
| 规则版本 | 登记版本与生效时间 | 历史与新字段混用,口径不明 |
| 失败监控 | 失败行数与缺失率单独出指标 | 指标悄悄变小,无人发现 |
| 字段类型 | 解析后显式转换类型 | 字符串比较导致数值判断错误 |
字段缺失与解析失败的行要单列监控,不能静默丢弃:真实的典型症状是某天指标突然变小,而任务依旧成功,问题要等到业务发现才暴露。
保留原始指针还有成本含义:完全保留原始日志可以做任意回溯,但存储成本高,通常的做法是原始日志按生命周期归档到对象存储,仓库里只保留结构化结果与指针。