Python lambda日志格式,多行输出到cloudwatch



我可以像这样覆盖默认的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'))

最新更新