AWS Lambda 记录到一个 JSON 行

kag*_*kij 3 python amazon-web-services aws-lambda elastic-stack amazon-cloudwatchlogs

我有一小段 Python 代码在 AWS lambda 中执行,但 Lambda 以一种非常不方便的格式将日志放入 CloudWatch Logs: 在此处输入图片说明

我想将这些日志发送给 ELK 进行可视化。有没有办法将所有 Lambda 迭代日志放到一个 json 文件中?

Chr*_*rio 7

预加载LambdaLoggerHandler使用标准类logging.Formatter。来源:https : //www.denialof.services/lambda/

将格式化程序替换为输出为 JSON 的自定义类。另外,extra字典可能包含additionnals值,extra['data']避免与他人的LogRecord性质的冲突。

import logging
import json

class FormatterJSON(logging.Formatter):
    def format(self, record):
        record.message = record.getMessage()
        if self.usesTime():
            record.asctime = self.formatTime(record, self.datefmt)
        j = {
            'levelname': record.levelname,
            'time': '%(asctime)s.%(msecs)dZ' % dict(asctime=record.asctime, msecs=record.msecs),
            'aws_request_id': getattr(record, 'aws_request_id', '00000000-0000-0000-0000-000000000000'),
            'message': record.message,
            'module': record.module,
            'extra_data': record.__dict__.get('data', {}),
        }
        return json.dumps(j)


logger = logging.getLogger()
logger.setLevel('INFO')

formatter = FormatterJSON(
    '[%(levelname)s]\t%(asctime)s.%(msecs)dZ\t%(levelno)s\t%(message)s\n',
    '%Y-%m-%dT%H:%M:%S'
)
# Replace the LambdaLoggerHandler formatter :
logger.handlers[0].setFormatter(formatter)


def lambda_handler(event, context):
    my_input = {
        'key1': 'value1',
        'key2': 'value2'
    }
    logger.info('Process Info: %s', 'Hello', extra=dict(data=my_input))
Run Code Online (Sandbox Code Playgroud)

但是,任何堆栈跟踪都会像往常一样保持渲染。

然后 CloudWatch 得到这个:

{
    "levelname": "INFO",
    "time": "2018-12-13T11:35:24.130Z",
    "aws_request_id": "2e0f7055-fecb-11e8-8376-b77695872964",
    "message": "Process Info: Hello",
    "module": "lambda_function",
    "extra_data": {
        "key1": "value1",
        "key2": "value2"
    }
}
Run Code Online (Sandbox Code Playgroud)