使用Python lambda

时间:2017-08-04 17:03:56

标签: python amazon-web-services aws-lambda amazon-cloudwatch

是否可以使用Python Lambda中的JSON Log Format登录CloudWatch?

我想创建一个指标来监控通过我的lambda的数据,而extracting data form JSON Log Events似乎非常合适。

我记录如下:

logger.info(dict(items=len(records), max_latency=max_latency))

日志显示在CloudWatch上:

[INFO]  2017-08-04T16:20:23.579Z    some-uuid   {'items': 1, 'max_latency': 1219403.5792706013}

但是当我尝试用这个创建一个指标时:

{ $.max_latency = * }

CloudWatch告诉我:

Found 0 matches out of 29 event(s) in the sample log.

3 个答案:

答案 0 :(得分:1)

我很确定问题是您在syslog格式的日志消息中提供了一些JSON格式的数据。您可能需要完全使用JSON进行日志记录,将[INFO]标记,时间戳和uuid移动到JSON文档中。

使用基本配置,您可以提供不包含JSON文档之外的数据的格式参数。

答案 1 :(得分:1)

日志条目有2个问题:

  • Python生成的JSON对于键而不是双引号(')使用单引号("),CloudWatch仅在使用"时识别它。
  • 正如@ user615501所指出的,整个日志消息必须是JSON。

由于lambda很容易被CPU绑定,而且我的JSON非常简单,所以我选择了这样的东西:

print('{"items": ' + str(len(records)) + ', "max_latency":' + str(max_latency) + '}')

哪个输出:

{"items": 1, "max_latency": 1219403.5792706013}

有效,我可以使用{ $.max_latency = * }成功过滤,并使用$.max_latency作为指标值。

答案 2 :(得分:0)

我找到了一种适应aws_lambda_logging

的hacky方法

如果你跑

aws_lambda_logging.setup(level='INFO',aws_request_id='not_a_lambda')

在最高级别,之后不要触摸您的日志配置,您的日志将自动显示在json中。我现在试图绕过内脏,给你一个更好的答案。