CloudWatch日志提取client、orderId等字段失败求解决方案
CloudWatch日志字段提取方案
日志格式示例
POST /api/v1/order 200 123 bytes 456 bytes 458.000 ms Apache-HttpClient/4.5.14 (Java/17.0.12) { "orderId": "A123" } {"partnerOrderId": "B456", "createdDate": "2023-04-05"}
原查询语句(无法正常工作)
fields @timestamp, @message, @client, @orderId, @partnerOrderId | parse @message /(?<@client>(?<=ms\s).*)/ | parse @message /(?<@orderId>(?<=orderId\s).*)/ | parse @message /(?<@partnerOrderId>(?<=partnerOrderId\s).*)/
问题分析
- 提取
@client时,.*是贪婪匹配,会捕获ms之后的所有内容,无法截止到{之前 - 提取
orderId和partnerOrderId时,仅匹配orderId\s后的内容,未考虑JSON键值对的引号结构,导致无法正确捕获ID值
正确查询语句
fields @timestamp, @message, @client, @orderId, @partnerOrderId | parse @message /ms\s(?<@client>.*?)\s{/ | parse @message /"orderId":\s*"(?<@orderId>[^"]+)"/ | parse @message /"partnerOrderId":\s*"(?<@partnerOrderId>[^"]+)"/
语句说明
- 提取@client:用非贪婪匹配
.*?,精准捕获ms之后到第一个{之前的客户端标识内容 - 提取orderId/partnerOrderId:直接匹配JSON键值对格式,
\s*忽略键与值之间的空格,[^"]+捕获引号内的ID字符串,确保只提取目标ID值
预期提取结果
@timestamp @message @client @orderId @partnerOrderId timestamp message Apache-HttpClient/4.5.14 A123 B456
内容的提问来源于stack exchange,提问作者vincentsty
相关产品推荐
相关产品推荐

