我正在尝试覆盖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何时添加其自己的处理程序?
答案 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