亚马逊云监控日志分析:使用正则表达式解析日志

42

我正在尝试使用parse命令来提取一个短暂的字段。不幸的是,日志格式使得通配符表达式无法满足需求,因此我需要使用正则表达式。正则表达式本身没问题,但我就是不能让这个命令提取任何内容。

我正在尝试以下命令:

parse @endpoint /^([a-zA-Z_]+)[\/|?]*.*/ as @clean_endpoint

我想要的是第一组,我尝试使用不同种类的引号等方式。可能只是一个愚蠢的格式错误,但我只是找不到它。

唯一提到parse命令的文档几乎只有这里,那里的示例使用了glob表达式。在谷歌搜索中也找不到任何示例。

那么有人遇到过这个问题并解决了吗?

2个回答

24

尝试另一种方法,比如

parse @message /(?<@endpt>(\/[a-zA-Z0-9_]+){1,})/
| stats count_distinct(@endpt) by @endpt

或者,作为替代方案,考虑这个解决方案

fields @timestamp
| parse @message /(?<@endpt_post>POST (\/[a-zA-Z0-9_]+){1,})/
| parse @message /(?<@endpt_get>GET (\/[a-zA-Z0-9_]+){1,})/
| stats count() by @endpt_post, @endpt_get

祝你好运!


我没想到你可以同时使用两个解析器。你甚至可以混合和匹配正则表达式/通配符。哇!! - andrew lorien
在示例中发现了有关正则表达式语法的参考... https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax-examples.html - Danylo Fedorov

22

不确定您是否找到了答案,但使用regex解析时,您不能像使用glob一样为短暂的字段命名。

在使用glob表达式时,您可以在语句末尾使用"as ___"来命名新字段。但是在正则表达式中尝试这样做会失败。

parse @message ((glob expression here)) as ephem_field

在使用正则表达式时,新字段应该在表达式本身内部作为一个命名组来命名。

parse @message /(?<clean_endpoint>^([a-zA-Z_]+)[\/|?]*.*)/
尽管正则表达式允许您使用单引号'name'或尖括号<name>来命名一个组,但我注意到在AWS CloudWatch Insights中只接受尖括号作为组名。当我尝试使用单引号时,会出现错误提示无法理解查询语句。
我不确定AWS正在使用哪种regex类型,但我发现我必须转义一些在其他工具中允许的字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接