无法在 AWS Lambda 中显示信息级别日志记录
Can't show info level logging in AWS Lambda
我正在尝试 运行 AWS lambda 中的脚本,我想在脚本 运行 之后将信息级别日志输出到控制台。我曾尝试从 寻求有关在 lambda 购买中使用日志的帮助,但没有成功。我认为 AWS Cloudwatch 覆盖了下面显示的我的配置。
import logging
# log configuration
logging.basicConfig(
format='%(levelname)s: %(message)s',
level=logging.INFO,
encoding="utf-8"
)
我想将日志记录级别设置为 logging.info。我怎样才能做到这一点? 运行时间是python3.9
根据我的理解,我认为一种解决方法是添加以下内容:
logging.getLogger().setLevel('INFO')
我相信 logging.basicConfig(level=...)
会影响日志在控制台中显示的最低日志级别,但会影响所有记录器。上面的那个显式地设置了根记录器的最低启用级别,即 logging.getLogger()
。每个记录器的启用级别决定了将在什么级别记录消息 - 否则,每次调用像 logging.info
这样的记录器方法基本上都是空操作。
所以本质上,basicConfig
和 setLevel
调用是分开的,但它们一起工作以确定库的日志是否打印到控制台。例如,您可以设置 basicConfig(level='DEBUG')
以便打印所有库的调试级别日志。但是如果你想为一个像 botocore
这样的库做一个例外,你可以使用 logging.getLogger('botocore').setLevel('WARNING')
,这会将那个库的最低启用级别设置为警告,所以只有这个库记录的消息高于该最低水平会打印到控制台。
您实际上需要知道 Python 在 lambda 中登录有点奇怪 - 如果您使用的是默认日志记录模块,当调用 lambda 并开始启动其后端时,它会创建一个日志处理程序 there 并将其附加到日志组的名称作为处理程序名称 - 而不是像 basicConfig 默认情况下那样的 name 属性创建一个日志处理程序
因此,basicConfig 试图根据 name 属性修改处理程序,找不到由 lambda 调用启动创建的处理程序,因此无法更新您的设置,在您的顶级 lambda 处理程序文件中,因为当您使用 getLogger 和 setLevel 时,它可以在其级别(在 lambda 中)看到一个日志记录处理程序,您自己设置该处理程序
因此,如果您只使用 getLogger() 它会在最顶层工作(lambda 处理程序及其文件),因为 lambda_handler 被导入后端代码 运行,所以它可以找到处理程序。
然而,任何进一步的导入都将寻找 lambda_handler 的 name 路径,并将它们的日志记录处理程序附加到该名称路径 - 这意味着它们的日志语句不会出现在云表中。
我找到了三个解决方案:
在 lambda 处理程序及其文件中使用 logger = getLogger() 和 setLevel - 您导入的任何其他文件,不要使用 getLogger - 而只是使用 import logging - logging.INFO(message)
强制记录器寻找默认处理程序并使用它(注意:这不是主意,您最终会失去对日志文件的很多控制
如果你不能使用任何额外的库,那么你必须在你的 lambda 处理程序中编写一些代码来查看当前的日志记录处理程序是否存在——如果存在,抓住它并根据需要调整它填充其余的进口。您可以找到散布在 SO
周围的代码
如果可以(我通常不喜欢说使用这个库的答案,所以即使我喜欢这个库,这也是答案三)使用 aws_lambda_powertools 及其模块 Logger -这是一个非常强大的日志记录模块,旨在与 python 中的现有日志记录语句和 aws 处理程序一起使用 - 以及 aws 本身的开源 python 项目。除了记录器之外,它还有很多很棒的工具,但是记录器非常非常棒。
我正在尝试 运行 AWS lambda 中的脚本,我想在脚本 运行 之后将信息级别日志输出到控制台。我曾尝试从
import logging
# log configuration
logging.basicConfig(
format='%(levelname)s: %(message)s',
level=logging.INFO,
encoding="utf-8"
)
我想将日志记录级别设置为 logging.info。我怎样才能做到这一点? 运行时间是python3.9
根据我的理解,我认为一种解决方法是添加以下内容:
logging.getLogger().setLevel('INFO')
我相信 logging.basicConfig(level=...)
会影响日志在控制台中显示的最低日志级别,但会影响所有记录器。上面的那个显式地设置了根记录器的最低启用级别,即 logging.getLogger()
。每个记录器的启用级别决定了将在什么级别记录消息 - 否则,每次调用像 logging.info
这样的记录器方法基本上都是空操作。
所以本质上,basicConfig
和 setLevel
调用是分开的,但它们一起工作以确定库的日志是否打印到控制台。例如,您可以设置 basicConfig(level='DEBUG')
以便打印所有库的调试级别日志。但是如果你想为一个像 botocore
这样的库做一个例外,你可以使用 logging.getLogger('botocore').setLevel('WARNING')
,这会将那个库的最低启用级别设置为警告,所以只有这个库记录的消息高于该最低水平会打印到控制台。
您实际上需要知道 Python 在 lambda 中登录有点奇怪 - 如果您使用的是默认日志记录模块,当调用 lambda 并开始启动其后端时,它会创建一个日志处理程序 there 并将其附加到日志组的名称作为处理程序名称 - 而不是像 basicConfig 默认情况下那样的 name 属性创建一个日志处理程序
因此,basicConfig 试图根据 name 属性修改处理程序,找不到由 lambda 调用启动创建的处理程序,因此无法更新您的设置,在您的顶级 lambda 处理程序文件中,因为当您使用 getLogger 和 setLevel 时,它可以在其级别(在 lambda 中)看到一个日志记录处理程序,您自己设置该处理程序
因此,如果您只使用 getLogger() 它会在最顶层工作(lambda 处理程序及其文件),因为 lambda_handler 被导入后端代码 运行,所以它可以找到处理程序。
然而,任何进一步的导入都将寻找 lambda_handler 的 name 路径,并将它们的日志记录处理程序附加到该名称路径 - 这意味着它们的日志语句不会出现在云表中。
我找到了三个解决方案:
在 lambda 处理程序及其文件中使用 logger = getLogger() 和 setLevel - 您导入的任何其他文件,不要使用 getLogger - 而只是使用
import logging - logging.INFO(message)
强制记录器寻找默认处理程序并使用它(注意:这不是主意,您最终会失去对日志文件的很多控制如果你不能使用任何额外的库,那么你必须在你的 lambda 处理程序中编写一些代码来查看当前的日志记录处理程序是否存在——如果存在,抓住它并根据需要调整它填充其余的进口。您可以找到散布在 SO
周围的代码如果可以(我通常不喜欢说使用这个库的答案,所以即使我喜欢这个库,这也是答案三)使用 aws_lambda_powertools 及其模块 Logger -这是一个非常强大的日志记录模块,旨在与 python 中的现有日志记录语句和 aws 处理程序一起使用 - 以及 aws 本身的开源 python 项目。除了记录器之外,它还有很多很棒的工具,但是记录器非常非常棒。