如何在AWS CloudWatch for Log Metric Filter中解析混合文本和JSON日志条目

时间:2016-07-24 21:25:48

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

我正在尝试解析混合了文本和JSON的日志条目。第一行是文本表示,下一行是事件的JSON有效负载。其中一个可能的例子是:

2016-07-24T21:08:07.888Z [INFO] Command completed lessonrecords-create
{
  "key": "lessonrecords-create",
  "correlationId": "c1c07081-3f67-4ab3-a5e2-1b3a16c87961",
  "result": {
    "id": "9457ce88-4e6f-4084-bbea-14fff78ce5b6",
    "status": "NA",
    "private": false,
    "note": "Test note",
    "time": "2016-02-01T01:24:00.000Z",
    "updatedAt": "2016-07-24T21:08:07.879Z",
    "createdAt": "2016-07-24T21:08:07.879Z",
    "authorId": null,
    "lessonId": null,
    "groupId": null
  }
}

对于此记录,我尝试将Log Metric Filter定义为a)匹配记录b)尽可能选择数据或维度。

根据AWS文档,JSON模式应如下所示:

{ $.key = "lessonrecords-create" }

然而它与任何东西都不匹配。我的猜测是因为在单个日志条目中混合文本和JSON。

所以,问题是:  1.是否可以定义与此日志格式匹配的模式?  2.是否可以从这种日志格式中提取尺寸,值?  3.帮助我完成这个模式。

4 个答案:

答案 0 :(得分:0)

如果您以定义的方式设置指标过滤器,则测试不会注册任何匹配项(我也遇到了这个问题),但是,当您部署指标过滤器时,它仍会注册匹配项(至少是我的)确实)。请记住,没有办法(据我所知)向后运行此度量标准筛选器(即,它将仅捕获创建时的数据)。 [如果您想获取过去数据的统计信息,最好使用日志洞察查询]

我目前正在尝试使用不同的分析语句来尝试提取数据(它也是JSON和文本的组合),该线程可以帮助您(对我而言不是)Amazon Cloudwatch Logs Insights with JSON fields

更新! 我找到了一种解析文本的方法,但它有点笨拙。如果您使用lamda函数将cloudwatch日志导出到SumoLogic,则其搜索工具可以更好地处理日志,并可以解析JSON字段(如果您将整个条目视为文本)。 SumoLogic也确实有帮助,因为您可以将搜索结果提取为CSV。出于我的目的,我在SumoLogic中解析了整个日志消息,将所有日志提取为CSV,然后在Python中使用了regex来过滤并提取所需的值。

答案 1 :(得分:0)

您可以将CloudWatch Events用于此类目的(也称为“订阅过滤器”),您需要做的是定义一个cloudwatch规则,该规则使用表达式语句来匹配您的日志。 在这里,我将让您阅读所有内容:

https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html

https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.html

:)

答案 2 :(得分:0)

将消息分成 3 个字段,第 3 个字段将是有效的 json 。我认为在你的情况下会

transform: translateZ(10px);

field3 是有效的 json。 [INFO} 将是第一个字段。

答案 3 :(得分:-2)

您可以使用流利的代理将日志发送到Cloudwatch。根据您的指标过滤器创建自定义grok模式。

步骤:

  • 在服务器中安装fluentd代理
  • 安装fluent-plugin-cloudwatch-logs插件和fluent-plugin-grok-parser插件
  • 根据您的日志格式编写自定义的grok模式

    请参考this博客以获取更多信息