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

如何在AWS Logs Insights中正确解析@message字段内的JSON对象

解析失败核心原因
  • CloudWatch Logs Insights的parse命令使用glob通配符(即此前用的*写法)时,单个*仅匹配不含空白字符的连续内容,遇到空格即刻终止匹配。日志前三个字段(时间戳、请求ID、日志级别)本身不含空格,但后续JSON对象内部存在空格、转义引号等字符,普通*无法捕获完整JSON片段。
  • glob模式默认从字符串头部按顺序匹配,parse @message 'ERROR *' as dataObj写法中,ERROR前存在时间戳、ID两个字段,模式从行首无法匹配到ERROR,直接匹配失败返回空值。
  • {"*"}、{*}类写法仍使用不跨空格/引号的*匹配,会直接拆碎JSON结构,返回缺引号、格式错乱的残片属于正常现象。
  • * * * *匹配出现字段错位,是因为第四个*仅捕获到JSON中第一个空格前的短片段,剩余内容无对应通配符承接,解析器会直接将未匹配的长串塞入第一个字段。
正确提取方案

不要用glob通配符模式解析,改用正则表达式模式的parse语法,正则可以匹配包含空格、特殊字符的任意长度内容,捕获完整JSON字符串后再做结构化解析即可,参考查询语句:

filter @message like 'ERROR'
| parse @message /^(\S+)\s+(\S+)\s+ERROR\s+({.*)$/ as ts, id, dataObjStr
| parse dataObjStr as dataObj

语句说明:

  • 正则部分用/ /包裹,标识这是正则匹配模式而非glob模式
  • \S+匹配连续非空白字符,刚好对应无空格的时间戳、请求ID两个字段
  • \s+匹配字段之间的任意数量空白分隔符
  • ({.*)$表示从JSON开头的{起,一直捕获到行尾的所有内容,不管内部有没有空格、引号、转义符,都能完整拿到整个JSON字符串存入dataObjStr
  • 最后一行parse dataObjStr as dataObj会自动把合法JSON字符串解析为可直接通过键访问的结构化对象,后续可以直接用dataObj.level、dataObj.log.message.statusCode这类方式访问内部字段。

如果日志行在JSON之后还有其他尾部内容,只需要把正则最后部分的$去掉,改成({.*)即可,依然能完整捕获从第一个{开始的JSON主体。

内容的提问来源于stack exchange,提问作者Eggon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:51:17