AWS Cloudwatch Log Insights - 按 JSON 日志事件的 JSON 过滤器过滤记录

Kee*_*asa 3 json amazon-web-services amazon-cloudwatch amazon-cloudwatchlogs

我有一个日志组,它将 JSON 日志累积到每个流中。这些 JSON 日志如下所示。

在此处输入图片说明

我想过滤日志在哪里"user" = "keet"。AWS 文档解释了使用指标筛选器从 JSON 日志事件中提取值。我使用 AWS 开发工具包进行了尝试,对于 NodeJS 中的以下代码运行良好。

let params = {
    logGroupName: 'log-goupe-name', /* required */
    filterPattern: '{$.user=keet}',

};
cloudwatchlogs.filterLogEvents(params, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else     console.log(data);           // successful response
});
Run Code Online (Sandbox Code Playgroud)

问题

同样,我想知道 AWS Cloudwatch Insights Dashboard 和 AWS Console 上是否也可以这样做?我知道字符串模式匹配是可能的。但我想知道是否可以在 Insights 仪表板上使用@filter. 来的默认查询如下。

fields @timestamp, @message
| sort @timestamp desc
| limit 20
Run Code Online (Sandbox Code Playgroud)

我尝试在Stackoverflow上遵循这个答案,但它仍然没有帮助。这仅用于解析数据。我的要求是根据 JSON 日志中的值过滤日志。

提前致谢。

Unk*_*nts 10

您可以像这样从 json 中解析出用户:

parse @message '"user":"*"' as user
Run Code Online (Sandbox Code Playgroud)

根据您想在仪表板上看到的内容,您可以仅过滤掉特定用户:

fields @message 
| parse @message '"user":"*"' as user
| filter user == "keet"
Run Code Online (Sandbox Code Playgroud)

结果将是:

#    @message                            user
----------------------------------------------                            
1    info - {"user":"keet","age":30 }    keet
2    info - {"user":"keet","age":30 }    keet  
3    info - {"user":"keet","age":30 }    keet
4    info - {"user":"keet","age":30 }    keet
Run Code Online (Sandbox Code Playgroud)

也可以尝试:

filter user == 'keet'
Run Code Online (Sandbox Code Playgroud)

也许 Insights 会自动发现这些字段。您可以在右侧的已发现字段部分中看到自动发现的字段列表。

  • 你可以做同样的事情:`parse @message '"user":"*"' as user | 解析@message '"first":"*"' 作为第一个 | 将@message '"last":"*"' 解析为 last`,但这不会为您提供 `name.first` 语法。你能试试`filter name.first == 'keet'` 也许Insights 会自动发现这些字段。我建议只记录 json 位(没有 `info -`)。 (2认同)