能否将LogQL的| json操作符应用于日志行的JSON子串?
用LogQL解析日志中的JSON子串并分组查询
核心结论
可以实现,但不能直接对整行日志用| json,得先提取出JSON子串,再指定解析这个子串字段——因为整个日志行不是纯JSON格式,直接解析会失败。
示例场景
假设你的日志行格式是这样:
2024-05-20 10:00:00 [INFO] {"message": "user login", "id": 123, "status": "success"}
2024-05-20 10:00:05 [INFO] {"message": "user login", "id": 123, "status": "success"}
2024-05-20 10:00:10 [INFO] {"message": "user logout", "id": 456, "status": "success"}
当前你使用的LogQL查询是:
{job="my-service"} |= "INFO"
实现步骤
- 提取JSON子串:用
| regex匹配日志格式,把JSON部分捕获到自定义字段(比如json_payload) - 解析JSON字段:用
| json field=json_payload指定解析这个捕获到的字段 - 分组聚合:用
by关键字按需要的字段(message、id)分组
最终的LogQL查询语句:
{job="my-service"} |= "INFO" | regex `^\S+ \S+ \[\w+\] (?P<json_payload>.*)$` | json field=json_payload | by message, id
语句解释
| regex^\S+ \S+ [\w+] (?P<json_payload>.*)$``:匹配日志开头的时间、日志级别部分,把后面的JSON内容存入json_payload字段(注意正则要根据你的实际日志格式调整,比如时间格式、日志级别包裹符不同时,要修改正则规则)| json field=json_payload:告诉LogQL不要解析整行,而是解析json_payload字段里的JSON内容,解析后就能直接调用message、id这些JSON字段| by message, id:按message和id对日志进行分组,默认会统计每组的日志数量,你也可以加上聚合函数(比如count_over_time(1m))来按时间窗口统计
和你的Bash实现对比
你的Bash脚本逻辑是「过滤日志→提取JSON→jq解析分组」,LogQL的思路完全一致,只是用LogQL原生语法实现,更适合在Loki中直接完成日志的查询与分析。
内容的提问来源于stack exchange,提问作者sdc
相关产品推荐
相关产品推荐

