【问题标题】:logger object not inheriting root level记录器对象不继承根级别
【发布时间】:2026-01-09 11:35:01
【问题描述】:

在尝试使用 python 的日志记录模块时,我遇到了一些意想不到的行为。我的猜测是这是由于我的误解,而不是错误,但是我无法弄清楚出了什么问题(并且我在测试之前一直小心地重新启动python内核,以确保root logger只配置一次.

import logging
logging.basicConfig(level=logging.CRITICAL)
logger1 = logging.getLogger(__name__)
logger1.debug("logger1 debug test")

正如预期的那样,日志消息没有输出。

如果我按如下方式更改记录器的级别:

logger1.setLevel('DEBUG')
logger1.debug("logger1 debug test")

我得到了预期的输出:

DEBUG:__main__:logger1 debug test

但是,当我现在创建一个新的 logger 对象时,它似乎继承了 logger1 的属性,而不是 root 的:

logger2 = logging.getLogger(__name__)
logger2.debug("logger2 debug test")

产生:

DEBUG:__main__:logger2 debug test

奇怪的是,logger2 仍然将根显示为父级,但显示级别为 10:

print(logger2.__dict__)

{'filters': [], 'name': '__main__', 'level': 10, 'parent': <RootLogger root (CRITICAL)>, 'propagate': True, 'handlers': [], 'disabled': False, '_cache': {10: True}, 'manager': <logging.Manager object at 0x00000265147F2B48>}

谁能解释一下为什么 logger2 不默认为级别 0 (NOTSET)?

【问题讨论】:

  • @AbhinavMathur 如果我理解这个问题(和答案),那么问题是用户不知道所有记录器对象的默认(有效)级别是根级别(即父母)。我的问题是相反的 - 我在问为什么 logger2 的默认(有效)级别与 root 不同
  • 试试logger2 = logging.getLogger()
  • 当然,我原来的logger2对象和logger1是同一个对象,因为我选择了同名!谢谢,我希望这很简单。

标签: python logging


【解决方案1】:

感谢@Abhinav Mathur 在 cmets 中提供的答案。

问题在于,通过尝试创建与 logger1 同名的 logger2,实际上我并没有创建新的 logger 对象。

【讨论】: