在Bash中使用AWS CLI处理含嵌套JSON的日志并实现过滤
解决方案:处理AWS日志中转义的嵌套JSON并过滤
服务端过滤的限制
AWS CLI的--query参数基于JMESPath语法,无法直接解析message字段中的转义嵌套JSON。因为服务端返回的message是字符串类型,而非结构化JSON对象,所以没法通过--query直接对嵌套的system_id等字段做服务端过滤,必须在客户端完成解析和过滤。
客户端处理方案(用jq实现)
借助jq工具(需提前安装),可以先将转义的message字符串解析为合法JSON,再进行条件过滤。
完整命令示例
aws logs get-log-events --log-group-name $LOGGROUP --log-stream-name $MYLOGSTREAM --region $MYREGION --profile $MYPROFILE | jq '[.events[] | select(.message | test("Warning")) | .message |= fromjson | select(.message.system_id == "SYS031")]'
命令拆解
aws logs get-log-events ...:获取原始日志数据,不再用--query做初步过滤(改由jq处理).events[]:遍历所有日志事件条目select(.message | test("Warning")):过滤出message包含"Warning"的条目(替代原--query的contains逻辑).message |= fromjson:将转义的message字符串解析为结构化JSON对象select(.message.system_id == "SYS031"):最终过滤出system_id等于"SYS031"的条目
扩展:保留原事件的其他字段
如果需要保留日志的timestamp等原始字段,调整jq的输出结构:
aws logs get-log-events --log-group-name $LOGGROUP --log-stream-name $MYLOGSTREAM --region $MYREGION --profile $MYPROFILE | jq '[.events[] | select(.message | test("Warning")) | {timestamp: .timestamp, message: (.message | fromjson)} | select(.message.system_id == "SYS031")]'
兼容解析失败的条目
如果部分日志的message存在JSON语法错误(比如示例中的stack_trace: }),可以用fromjson?忽略解析失败的条目,避免命令中断:
aws logs get-log-events --log-group-name $LOGGROUP --log-stream-name $MYLOGSTREAM --region $MYREGION --profile $MYPROFILE | jq '[.events[] | select(.message | test("Warning")) | .message |= fromjson? | select(.message?.system_id == "SYS031")]'
内容的提问来源于stack exchange,提问作者Anders
相关产品推荐
相关产品推荐

