如何在CloudWatch Logs Insights中处理字符串化JSON数组并索引元素
解决CloudWatch Logs Insights访问JSON数组元素的问题
1. 直接按索引提取数组元素(无需unnest)
如果要在单条日志中获取数组指定索引的元素字段,不需要使用unnest,解析数组后直接用索引访问即可:
fields jsonParse(array) as parsedArray, parsedArray[0].itemId as first_item_id, parsedArray[0].site as first_site, parsedArray[1].itemId as second_item_id, parsedArray[2].site as second_site | display first_item_id, first_site, second_item_id, second_site
2. 正确使用unnest展开数组元素
你之前用unnest array into item的写法是正确的,它的作用是将原单条日志拆分为多条日志,每条对应数组中的一个元素,并非只返回一个元素。比如原日志包含3个元素的数组,执行后会生成3条日志,每条的item对应数组里的一个对象。要查看所有元素的字段,用以下语句:
fields jsonParse(array) as parsedArray | unnest parsedArray as item | display item.itemId, item.site, item.age
3. 为什么你的索引式unnest写法不生效
unnest的语法规则是unnest <数组字段> into <单个变量名>,它的功能是拆分数组元素为独立日志条目,不支持同时将多个索引元素赋值给不同变量,所以你写的unnest array into items.0, items.1, items.2不符合语法,无法生效。
关键注意事项
确保Lambda输出的是标准JSON字符串:你的示例日志用了单引号,而标准JSON要求双引号,这会导致jsonParse解析失败。Lambda中必须用JSON.stringify()将数组转为标准JSON后再输出:
const logArray = [ { itemId: 1, site: 'CND', age: 5 }, { itemId: 2, site: 'USC', age: 3 }, { itemId: 3, site: 'NYC', age: 7 } ]; console.info(JSON.stringify(logArray));
内容的提问来源于stack exchange,提问作者Lemour
相关产品推荐
相关产品推荐

