AWS Cloudwatch Log Insights - 替换字符串功能

问题描述 投票:0回答:5

如何使用 AWS Cloudwatch Log Insights 的 replace 功能?

文档没有给出工作示例。

给定的日志包含诸如

/api/lumberjack/123/axe/456/fashion

之类的路径

我正在努力:

fields message
| parse message "path=* " as path
| fields replace(path, /[0123456789]+/, 'ID') as uniqpath
| stats count(*) by uniqpath

我希望得到这样的结果:

uniqpath | count
/api/lumberjack/ID/axe/ID/fashion | 12
/api/lumberjack/ID/beardedness | 44

但它却抱怨“无效的参数,收到:(路径)但预期:(str:字符串,searchValue:字符串,replaceValue:字符串)”

amazon-web-services aws-cloudwatch-log-insights
5个回答
6
投票

replace
函数接受字段作为第一个参数的输入。

不支持的是第二个论点。您正在传递一个不被识别为字符串的正则表达式。

我还没有找到将正则表达式转换为字符串的方法。但至少你可以为第一个参数传递字段名

path
。我已经测试过它更改普通字符串的正则表达式。

查询:

fields @message
| parse @message "path=*" as path
| fields replace(path, 'lumberjack', 'ID') as uniqpath
| stats count(*) by uniqpath

结果:

Query results


4
投票

你不能一步用正则表达式替换,这是理想的情况。相反,您必须梳理出可能的 id,合并为其提供默认值,然后用占位符替换该显式值。这将允许您获取端点计数,而不考虑特定的记录 ID。

这个简单版本适用于最多具有一个 id 的端点:

filter path like /\/api\/v/
| parse path /(?<@id1>\/[0-9]+)(\/|$)/
| fields coalesce(@id1, "") as id1
| fields replace(path, id1, "/{id}") as unique_path
| stats count(*) as requests by unique_path
| sort requests desc
| display unique_path, requests

如果您的记录 ID 更复杂,您可以相应地更新正则表达式。我必须这样做,因为我们的一些应用程序端点接受 ids 作为十六进制字符串,即“0x04f5”。

下一个版本最多可支持 2 个 ID。有关更多信息,您可以查看如何重复给定的模式,但我没有在 URL 路径中找到 n 计数 id 的快捷方式。

filter path like /\/api\/v/
| parse path /(?<@id1>\/[0-9]+)(\/|$)/
| fields coalesce(@id1, "") as id1
| fields replace(path, id1, "/{id}") as unique_path1
| parse unique_path1 /(?<@id2>\/[0-9]+)(\/|$)/
| fields coalesce(@id2, "") as id2
| fields replace(unique_path1, id2, "/{id2}") as unique_path
| stats count(*) as requests by unique_path
| sort requests desc
| display unique_path, requests

0
投票

错误消息非常不言自明。

replace
函数需要第一个参数的字符串类型输入。您提供的字段名称
path
是不可接受的。

编辑:令我惊讶的是,

replace
函数接受路径作为第一个参数,文档中没有提到这一点。请参阅上面奥马尔的回答。


0
投票

还没有测试过,但我曾经做过类似的东西,所以你的应该如下所示:

fields @message
| parse @message "path=* " as path
| parse path /(?<@endpt>(\/[0123456789]+\/?))/
| fields replace(path, coalesce(@endpt, ''), '/{id}/') as uniqpath
| stats count(*) by uniqpath

0
投票

Log Insights 推出了 OpenSearch Sql。您现在可以通过以下方式执行此操作:

SELECT 
  count(*) as req_count,
  regexp_replace(path, '(\/\\d+\/*)', '/<id>/') as regex_path
FROM your-log-group
GROUP BY regexp_replace(path, '(\/\\d+\/*)', '/<id>/')
© www.soinside.com 2019 - 2024. All rights reserved.