如何在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
相关产品推荐
相关产品推荐

