python 登录 aws lambda

Jac*_*ome 6 python logging amazon-web-services aws-lambda

尽管阅读了文档,但我在使用 python 日志记录时还是无法在内部点击。

我有这个代码

import logging
logging.basicConfig(level=logging.INFO,format='%(levelname)s::%(message)s')
LOG = logging.getLogger("__name__")
LOG.info("hey")
Run Code Online (Sandbox Code Playgroud)

如果我从 bash 运行它,我会得到:

INFO::hey
Run Code Online (Sandbox Code Playgroud)

如果我在 aws lambda 中运行它,“嘿”根本不会出现在日志中。

然后我通过添加以下内容进行了设置记录器级别的测试:

LOG.setLevel(logging.INFO)
Run Code Online (Sandbox Code Playgroud)

从 bash 运行,我得到了之前得到的相同结果(所需的格式),但是从 lambda 运行,这显示在日志中:

[INFO] 2022-02-14T23:30:43.39Z eb94600a-af45-4124-99b6-d9651d6a3cf6 hey
Run Code Online (Sandbox Code Playgroud)

好吧……这很奇怪。其格式与 bash 中的格式不同。

我想我可以合理化第一个示例,因为 bash 上的输出实际上会发送到 stderr。然后我假设 aws lamdba 日志没有抓住这一点。但第二个示例也会在 bash 上发送到 stderr,但它显示在 lambda 日志中,但格式错误。很明显我错过了一些东西。

这里到底发生了什么?

Ano*_*ard 6

当您的 Lambda 运行时,会运行一个工具来执行一些基本的引导程序,然后加载您的模块并调用它。AWS Lambda Python 运行时中的部分引导程序用自己的记录器替换了标准 Python 记录器:

    logger_handler = LambdaLoggerHandler(log_sink)
    logger_handler.setFormatter(
        logging.Formatter(
            "[%(levelname)s]\t%(asctime)s.%(msecs)dZ\t%(aws_request_id)s\t%(message)s\n",
            "%Y-%m-%dT%H:%M:%S",
        )
    )
    logger_handler.addFilter(LambdaLoggerFilter())
Run Code Online (Sandbox Code Playgroud)

此行为由 AWS在“日志记录库”部分下正式记录为Python 中的 AWS Lambda 函数日志 记录。