是否为模块创建新的记录器仍使用根记录器名称?

时间:2019-09-05 04:47:33

标签: python python-3.x python-logging

我正在看这篇文章:https://docs.python.org/3.7/howto/logging.html#logging-basic-tutorial

该段:

  

记录器层次结构的根称为根记录器。那是   函数debug(),info(),warning(),error()使用的记录器   和critical(),它们仅调用根的同名方法   记录器。函数和方法具有相同的签名。的   root记录器的名称在记录的输出中显示为“ root”。

我很困惑,因为一旦使用logger = logging.getLogger(__name__)创建记录器并使用logger.info/debug/etc。,模块的名称应该被打印而不是root。为什么该段说:“ ...仅调用根记录器的同名方法”

1 个答案:

答案 0 :(得分:3)

措辞很重要。

  

[...]这就是函数所使用的记录器,它们只调用同名方法的debug(),info(),warning(),error()和critical()。根记录器。 [...]

该段引用了模块级实用程序功能debug()info()warning()error()critical()。实际上,它们全部都在根记录器上运行,例如:

def debug(msg, *args, **kwargs):
    """
    Log a message with severity 'DEBUG' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.debug(msg, *args, **kwargs)

这些模块级功能可以在documentation中找到。

当然,当通过logging.getLogger(__name__)创建自己的记录器并在该实例上调用各自的方法时,您将对记录器进行操作,而不是根操作(除非明确禁用,否则仍然会传播)。

编辑:
我刚刚意识到,这个问题以及您以前的问题已经George's excellent, in-depth reply回答了您稍早的问题。我强烈建议您仔细阅读。