【问题标题】:Python logging can't change log level of root loggerPython日志记录无法更改根记录器的日志级别
【发布时间】:2020-11-19 13:42:37
【问题描述】:

我正在尝试更改根记录器的日志级别。当使用 getEffectiveLevel() 查询时,它似乎发生了变化,但实际上并没有记录任何与更改前不同的内容。

例如:

>>> import logging
>>> root_logger = logging.getLogger()
>>> root_logger.getEffectiveLevel()
30
>>> root_logger.warning('test')
test
>>> root_logger.info('test')
>>> root_logger.setLevel(logging.DEBUG)
>>> root_logger.getEffectiveLevel()
10
>>> root_logger.warning('test')
test
>>> root_logger.info('test')
>>> root_logger.debug('test')

这是为什么?我错过了我需要做的其他事情吗?让我感到困惑的是,我可以设置级别并使用 getEffectiveLevel 查看它,但它根本不会改变行为。

我在 Python 3.7.3 上使用内置的日志记录模块(版本 0.5.1.2)。

【问题讨论】:

  • 您可能还需要调整处理程序级别,也许我忘记了其他一些事情。

标签: python python-3.x logging


【解决方案1】:

您还没有为记录器(或记录系统)配置任何处理程序。

这意味着,基于the code herelogging 默认为this last-resort logger,这是一个具有WARNING 阈值的stderr logger,因此,它不处理那些调试消息.

【讨论】:

  • 我了解它如何解析默认的日志记录处理程序。令我困惑的是为什么setLevel 没有更改级别,即使getEffectiveLevel 说它已更改。是否需要从root_logger 获取默认处理程序,然后更改默认处理程序的级别?
  • 以你的例子,root_logger.handlers 将产生[]没有配置处理程序,但logging 模块有一个最后的处理程序(请参阅链接代码!)因此关键消息不会完全丢失。
  • 使用例如logging.basicConfig(level=logging.WARNING) 在根记录器上配置一个非最后的处理程序。
  • 您知道为什么getEffectiveLevel 会报告设置的级别吗?似乎即使我依赖最后的处理程序,setLevel 也应该像您期望的那样设置日志级别。 getEffectiveLevelsetLevel 同意,但最后的处理程序似乎没有相应的行为。
  • logger 本身已配置为该级别 - 尝试将其设置为更高级别,例如root_logger.setLevel(logging.ERROR) 并发出警告;由于记录器将其过滤掉,因此不会发出警告。处理程序有自己的级别过滤器设置;您可能希望电子邮件发送处理程序只处理错误消息,但无论如何都要附加到根记录器。
猜你喜欢
  • 2016-02-20
  • 2012-11-01
  • 1970-01-01
  • 2014-09-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
相关资源
最近更新 更多