【问题标题】:Can't show info level logging in AWS Lambda无法在 AWS Lambda 中显示信息级别日志记录
【发布时间】:2021-11-20 20:02:31
【问题描述】:

我正在尝试在 AWS lambda 中运行脚本,并且我想在脚本运行后将信息级别日志输出到控制台。我尝试向This post 寻求有关在 lambda 购买中使用日志的帮助,但没有任何成功。我认为 AWS Cloudwatch 正在覆盖我的配置,如下所示。


import logging
# log configuration
logging.basicConfig(
    format='%(levelname)s: %(message)s',
    level=logging.INFO,
    encoding="utf-8"
    )

我想将日志记录级别设置为 logging.info。我怎样才能做到这一点?运行时是python 3.9

【问题讨论】:

  • 你试过logging.getLogger().setLevel('INFO')吗?
  • 是的,谢谢,这解决了问题。现在有谁知道为什么这有效而level=logging.INFO 没有?一旦我们知道为什么我会将此标记为关闭。
  • 据我了解,我认为logging.basicConfig(level=...) 会影响日志显示在控制台中的最低日志级别,但会影响 所有 记录器。我在上面添加的明确设置了根记录器的最低启用级别,即logging.getLogger()。每个记录器的启用级别决定了将记录消息的级别 - 否则,每次调用像 logging.info 这样的记录器方法基本上都是无操作的。
  • 您能否将以上内容发布为答案,以便我将其标记为已关闭?

标签: python aws-lambda python-logging


【解决方案1】:

据我了解,我认为一种解决方法是添加以下内容:

logging.getLogger().setLevel('INFO')

我相信logging.basicConfig(level=...) 会影响日志显示在控制台中的最低日志级别,但会影响所有记录器。上面的一个显式设置了根记录器的最低启用级别,即logging.getLogger()。每个记录器的启用级别决定了将记录消息的级别 - 否则,每次调用像 logging.info 这样的记录器方法基本上都是无操作的。

所以本质上,basicConfigsetLevel 调用是分开的,但它们共同确定库的日志是否打印到控制台。例如,您可以设置basicConfig(level='DEBUG') 以便打印所有库的调试级别日志。但是,如果您想为 botocore 之类的库创建一个例外,例如,您可以使用 logging.getLogger('botocore').setLevel('WARNING'),这会将该库的最低启用级别设置为 WARNING,因此只有该库记录的消息高于该最低级别打印到控制台。

【讨论】:

    【解决方案2】:

    您实际上需要知道 lambdas 中的 Python 日志记录有点奇怪 - 如果您使用默认日志记录模块,当调用 lambda 并开始启动其后端时,它会创建一个日志记录处理程序 那里 并将其作为处理程序名称附加到日志组的名称 - 而不是 name 属性,因为 basicConfig 在创建日志处理程序时默认执行的操作

    因此,basicConfig 尝试根据 name 属性修改处理程序,但找不到由 lambda 调用启动创建的处理程序,因此无法更新您的设置,其中在您的顶级 lambda 处理程序文件中,因为当您使用 getLogger 和 setLevel 您自己设置该处理程序时,它可以在其级别(在 lambda 中)看到一个日志处理程序

    因此,如果您只使用 getLogger(),它会在最顶层(lambda 处理程序及其文件)工作,因为 lambda_handler 正在被导入后端代码以运行,因此它可以找到处理程序。

    但是,任何进一步的导入都将寻找 lambda_handler 的 name 路径,并将其日志处理程序附加到该名称路径 - 这意味着他们的日志记录语句将不会显示在云监控中。

    我找到了三种解决方案:

    1. 在 lambda 处理程序及其文件中使用 logger = getLogger() 和 setLevel - 您导入的任何其他文件,不要使用 getLogger - 而只是使用 import logging - logging.INFO(message) 强制记录器查找默认处理程序并使用它(注意:这不是主意,您最终会失去对日志文件的大量控制

    2. 如果你不能使用任何额外的库,那么你必须在你的 lambda 处理程序中编写一些代码来查看当前的日志处理程序是否存在 - 如果存在,抓住它并根据需要调整它以填充其余的导入.你可以找到散落在 SO 周围的代码

    3. 如果可以(我通常不喜欢使用这个库的答案,所以即使我喜欢这个库,这也是答案三的原因)使用 aws_lambda_powertools 及其模块 Logger - 这是一个非常强大的日志记录模块,旨在与您在 python 中现有的日志记录语句和 aws 处理程序 - 它是 aws 自己的开源 python 项目。除了记录器之外,它还有很多很棒的工具,但是记录器非常棒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      相关资源
      最近更新 更多