AWS Cloud Watch:指标筛选值提取

时间:2016-06-24 16:07:26

标签: amazon-web-services amazon-cloudwatch amazon-cloudwatchlogs

我将cloud-init.log日志发送到CloudWatch,我想创建一个指标过滤器,以提取Cloud Init运行所报告的时间。

示例日志条目如下所示:

Jun 24 12:06:51 ip-x-x-x-x [CLOUDINIT] util.py[DEBUG]: cloud-init mode 'modules' took 295.097 seconds (294.83)

我想要提取的价值是:295.097

看起来非常简单,因为took [number] seconds对于这一行来说是独一无二的。 This guide on metric filter syntax似乎只显示了从JSON日志中提取值的示例,而this official example list并未涵盖它。

根据文档,我想像:

[..., "took", seconds]

可行,但我没有多少运气。

任何帮助都会非常感激!

3 个答案:

答案 0 :(得分:1)

您尝试的内容几乎是正确的,只是语法上有细微变化。

代替

[..., "took", seconds]

应该是

[..., took="took", seconds, secondsword, secondsparentheses]

最后两个单词无关紧要,我试图选择有用的名称来表示它们的含义。

有了这个,seconds变量现在将包含295.097,您可以在指标中使用它。

...可以在开头或结尾使用,但似乎不能同时使用,这就是为什么我们必须在之后叫出secondswordsecondsparentheses的原因。

答案 1 :(得分:1)

稍微概括一下这个答案。
以空格分隔的日志行的指标过滤器语法必须锚定在行首或行尾,您可以在另一端使用 ... 表示您不关心其中有多少列那个方向。
给定具有以下空格分隔值的日志行
1 2 3 4 5 6
您可以像这样捕获第四列中的值
[、、、四、...]
表示您想要从开始的第 4 列中的值

[...,四,,]
表示您想要从末尾开始的第 3 列中的值。
测试这些模式,将显示 $four=4

接受的答案是正确的,但不需要定义最后两个列名称。他们只需要空的占位符,所以
[..., take="took", seconds, secondsword, secondsparentheses]
变得刚刚
[...,took=took,seconds,,]
从技术上讲,如果您知道 每个 日志行都是相同的语法,您甚至不需要 take=took。但是,添加 take=took 可确保您只匹配从行尾起第 4 列中包含该单词的日志行,并且像这样始终匹配日志行中的至少一个已知项目可能是最安全的。

答案 2 :(得分:0)

要提取值,我认为您需要以json或空格分隔格式格式化日志。对于上面的示例,这很困难,因为您尝试从消息中提取值。

这很难看,但这很有效(在Metric过滤器编辑器中测试得到$ value = 295.097):

[month, day, time, ip, process, module, name, mode, modules, type=took, value, therest]

您可能希望更改日志格式以简化操作。