如何在Python中使用Boto3过滤CloudWatch日志

时间:2020-06-07 14:43:10

标签: python aws-api-gateway boto3 amazon-cloudwatch

我想使用Cloudwatch过滤来自API Gateway的日志。

这是我的日志的一个示例:

(f810f3b1-5aqa-4af1-be31-bq10d3w99fqp) Endpoint request body after transformations: {"domain":"example.com"}
(f810f3b1-5aqa-4af1-be31-bq10d3w99fqp) HTTP Method: POST, Resource Path: /v/
(f810f3b1-5aqa-4af1-be31-bq10d3w99fqp) API Key: **************
(f810f3b1-5aqa-4af1-be31-bq10d3w99fqp) Method request path: {}
(f810f3b1-5aqa-4af1-be31-bq10d3w99fqp) Method request query string: {0.49120039624=}

我的目标是仅过滤包含请求主体的@message,以使用boto3从中获取域。这是我的代码:

query = "fields @timestamp, @message | filter @message in ['domain']"

response_query = client.start_query(
        logGroupName=log_group, 
        startTime=int((datetime.now() - timedelta(hours=5)).timestamp()),
        endTime=int(datetime.now().timestamp()),
        queryString=query,
        limit=1000
    )

=> {'results': [], 'statistics': {....} 该查询没有任何结果,您知道为什么吗?

1 个答案:

答案 0 :(得分:1)

解决方案是使用like运算符进行模糊匹配。 CloudWatch查询中的in运算符类似于Python等其他语言中的运算符,

>>> 'a' in ['a', 'b']
True

in仅检查完全匹配。它在CloudWatch中的典型用法是在发现的日志字段中检查低基数集成员身份。例如,在Lambda日志中发现的日志字段@type表示Lambda调用中的日志消息的类型。可能的值为STARTENDREPORT。换句话说,该集合的基数为3,这非常低。然后,我可以使用以下查询来了解最近调用中的持续时间和最大内存使用情况。

fields @timestamp, @message
| filter @type in ['REPORT']
| sort @timestamp desc