You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将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"

实现步骤

  1. 提取JSON子串:用| regex匹配日志格式,把JSON部分捕获到自定义字段(比如json_payload)
  2. 解析JSON字段:用| json field=json_payload指定解析这个捕获到的字段
  3. 分组聚合:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:52:16