2

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

这段落:

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

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

4

1 回答 1

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)

这些模块级函数可以在文档中找到。

当然,当通过创建自己的记录器logging.getLogger(__name__)并在该实例上调用相应的方法时,您在记录器上操作,而不是根(主要是,仍然存在传播,除非明确禁用)。

编辑:我刚刚意识到,乔治对您稍早的问题的出色、深入的答复
已经回答了这个问题以及您之前的问题。我强烈建议您仔细阅读。

于 2019-09-05T08:13:03.147 回答