我可以像这样覆盖默认的Lambda python日志格式:
LOG_FORMAT = '[%(levelname)s] %(asctime)s.%(msecs)dZ [%(filename)s] [%(funcName)s] %(message)s'
DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S'
logging.basicConfig(format=LOG_FORMAT, level=logging.INFO, datefmt=DATETIME_FORMAT, force=True)
LOG = logging.getLogger()
但是我注意到日志行会在cloudwatch中根据换行符打印到单独的行。
如果我尝试记录一个格式化的XML文档(到Cloudwatch),我最终会有效地为XML文档中的每一行添加新的日志行。
但是在修改默认格式之前,XML文档将显示为单个日志行,我可以轻松地复制&粘贴出Cloudwatch
改变格式前:
[INFO] 2022-11-30T02:16:54.345Z dc2518d8-60f3-461c-812b-c70b1b836592
SNS message: <?xml version="1.0"?>
<Document>
...
</Document>
在cloudwatch中,单击默认输出将显示整个文档,可以轻松复制。
格式更改后:
[INFO] 2022-11-29T11:40:47.563Z [function.py] [handler] SNS message:
2022-11-29T11:40:47.563Z <?xml version="1.0"?>
2022-11-29T11:40:47.563Z <Document>
2022-11-29T11:40:47.563Z ...
2022-11-29T11:40:47.563Z</Document>
默认格式化程序是否解析字符串并替换换行符?我知道r在CloudWatch中与n的处理方式不同。
这是Lamba Python运行时引导代码:
https://github.com/aws/aws-lambda-python-runtime-interface-client/blob/main/awslambdaric/bootstrap.py
通过编辑现有的格式化程序找到了一个解决方案:
LOG = logging.getLogger()
LOG.setLevel(logging.INFO)
log_handler = LOG.handlers[0]
log_handler.setFormatter(logging.Formatter('[%(levelname)s] %(asctime)s.%(msecs)dZ [%(filename)s] [%(funcName)s] %(message)sn'))