Cloudwatch Logs Insights 处理多个@messages

CPB*_*CPB 5 amazon-cloudwatch amazon-cloudwatchlogs aws-cloudwatch-log-insights

我有以下查询,输出如下:

Query:
filter @message like /A:|B:/ 

Output:
[INFO] 2020-07-28T09:20:48.406Z requestid A: [{'Delivery': OK, 'Entry': 12323 }]
[INFO] 2020-07-28T09:20:48.407Z requestid B: {'MyValue':0}
Run Code Online (Sandbox Code Playgroud)

我想打印ONLY的乙消息中,当一个消息“myvalue的” = 0。对于上面的例子,我必须有以下输出

Output:
[INFO] 2020-07-28T09:20:48.406Z requestid A: [{'Delivery': OK, 'Entry': 12323 }]
Run Code Online (Sandbox Code Playgroud)

对于下一个示例

[INFO] 2020-07-28T09:20:48.406Z requestid A: [{'Delivery': OK, 'Entry': 12323 }]
[INFO] 2020-07-28T09:20:48.407Z requestid B: {'MyValue':12}
Run Code Online (Sandbox Code Playgroud)

输出应该是空的

我不能做这样的事情,因为我想念 A 消息:

filter @message like /A:|B:/ 
filter MyValue = 0
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Yon*_*iXw 5

如果有人仍然感兴趣,有一些方法可以从按字段分组中获取第一个和最后一个。因此,如果您可以将数据放入消息对中,可能会有所帮助。

例如,给定 API Gateway 访问日志(每行是一个@message):

2021-09-14T14:09:00.452+03:00   (01c53288-5d25-*******) Extended Request Id: ***************
2021-09-14T14:09:00.452+03:00   (01c53288-5d25-*******) Verifying Usage Plan for request: 01c53288-5d25-*******. API Key: API Stage: **************/dev
2021-09-14T14:09:00.454+03:00   (01c53288-5d25-*******) API Key authorized because method 'ANY /path/{proxy+}' does not require API Key. Request will not contribute to throttle or quota limits
2021-09-14T14:09:00.454+03:00   (01c53288-5d25-*******) Usage Plan check succeeded for API Key and API Stage **************/dev
2021-09-14T14:09:00.454+03:00   (01c53288-5d25-*******) Starting execution for request: 01c53288-5d25-*******
2021-09-14T14:09:00.454+03:00   (01c53288-5d25-*******) HTTP Method: GET, Resource Path: /path/json.json
2021-09-14T14:09:00.468+03:00   (01c53288-5d25-*******) Method completed with status: 304
Run Code Online (Sandbox Code Playgroud)

我们可以从最后两行获取方法、uri 和返回代码。为此,我将相关数据解析为参数,然后通过请求 id(我也解析)进行聚合来获取它们

神奇之处在于:使用像sortsFirst()andsortsLast()和 group by 这样的统计数据@reqid。(AWS 文档

注意:IMO,不要使用earliest()andlatest()因为它们依赖于内置@timestamp并且对我来说很奇怪,其中 2 个连续消息具有相同的时间戳

因此,例如,使用以下查询:

filter @message like "Method"
| parse @message /\((?<@reqid>.*?)\) (.*?) (Method: (?<@method>.*?), )?(.*?:)* (?<@data>[^\ ]*)/ 
| sort @timestamp desc
| stats sortsFirst(@method) as @reqMethod, sortsFirst(@data) as @reqPath, sortsLast(@data) as @reqCode by @reqid
| limit 20
Run Code Online (Sandbox Code Playgroud)

我们将得到以下所需的输出:

@reqid                                  @reqMethod   @reqPath    @reqCode
f42e2b44-b858-45cb-*****************    GET          /path-******.json  304
fecddb03-3804-4ff5-*****************    OPTIONS      /path-******.json  200
e8e47185-6280-4e1e-*****************    GET          /path-******.json  304
e4fa9a0c-6d75-4e26-*****************    GET          /path-******.json  304
Run Code Online (Sandbox Code Playgroud)