尽管阅读了文档,但在Python日志记录方面,有些东西在我内部并没有点击。
我有这个代码
import logging
logging.basicConfig(level=logging.INFO,format='%(levelname)s::%(message)s')
LOG = logging.getLogger("__name__")
LOG.info("hey")
如果我从bash运行它,我会得到这个:
INFO::hey
如果我在aws lambda中运行它;嘿"根本没有显示在日志中。
然后我做了一个测试,通过添加以下内容在记录器上设置级别:
LOG.setLevel(logging.INFO)
从bash运行我得到了与以前相同的东西(所需的格式(,但从lambda运行,这显示在日志中:
[INFO] 2022-02-14T23:30:43.39Z eb94600a-af45-4124-99b6-d9651d6a3cf6 hey
好吧。。。这很奇怪。格式与bash中的不同。
我想我可以合理化第一个例子,因为bash的输出实际上是到stderr的。然后我假设aws的lamdba日志没有抓住它。但第二个示例也将在bash上执行stderr,但它显示在lambda日志中,但格式错误。很明显我错过了什么。
引擎盖下面发生了什么事?
当你的Lambda运行时,一个线束正在运行,它会进行一些基本的引导,然后加载你的模块并调用它。AWS Lambda Python Runtime中的部分引导用它自己的取代了标准的Python记录器
logger_handler = LambdaLoggerHandler(log_sink)
logger_handler.setFormatter(
logging.Formatter(
"[%(levelname)s]t%(asctime)s.%(msecs)dZt%(aws_request_id)st%(message)sn",
"%Y-%m-%dT%H:%M:%S",
)
)
logger_handler.addFilter(LambdaLoggerFilter())
AWS将此行为正式记录为Python中的AWS Lambda函数日志,在";日志库";。