覆盖python lambdas默认日志记录格式

时间:2020-08-15 23:36:49

标签: python aws-lambda

我正在尝试覆盖python lambda中的默认日志记录格式。关注了此blog post 简而言之,在我的lambda函数中执行此操作似乎很简单:

LOGGER = logging.getLogger()
HANDLER = LOGGER.handlers[0]
HANDLER.setFormatter(logging.Formatter(“[%(asctime)s] %(levelname)s:%(name)s:%(message)s”, “%Y-%m-%d %H:%M:%S”))

但是执行它时,我的LOGGER.handlers中没有处理程序。因此,覆盖失败。 我尝试用自己的格式化程序添加新的StreamHandler

LOGGER = Logger.factory(name)
sh = logging.StreamHandler()
sh.setFormatter(JSONFormatter())
LOGGER.add_handler(sh)

那行得通,但是我尝试记录的每一行都有两条相同的日志行。我的自定义StreamHandler及其格式程序中的一项,以及默认的lambda格式化行中的一项。 看来最后我有两个处理程序。

我的问题是,我应该在哪里覆盖日志记录处理程序的格式-lambda何时添加其自己的处理程序?

1 个答案:

答案 0 :(得分:0)

我会在运行开始时更改默认的python格式化程序。

import logging
logging.Formatter.format = my_format_function

我使用相同的方法来覆盖makeRecord函数以包含更多元数据。

import logging

def myMakeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None, another=None):
    """
    The normal python handler does not provide all the fields, so this enriches the message and formats it for logz.io.
    """
    if extra is None:
        extra = {}

    extra.update({'message': msg,
                  'logger': name,
                  'line_number': lno,
                  'path_name': fn})

    if func is not None:
        extra.update({'func_name': func})

    msg = json.dumps(extra)
    extra = None

    return original_makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=func, extra=extra)

logging.Logger.makeRecord = myMakeRecord