子记录器的默认处理程序是什么?

时间:2019-10-25 14:29:35

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

我了解到,如果未使用lastResort配置根记录程序处理程序,并且用户使用logging.basicConfig,则根记录程序具有logging.info/debug/warning/error/critical("some msg")处理程序,该处理程序将打印到控制台。 或logger = logging.gerLogger()后跟logger.info/debug/warning/error/critical("some msg")

但是对于使用logger = logging.getLogger("someName")创建的子记录器,当我们编写logger.info/debug/warning/error/critical("some msg")时,没有配置处理程序,而当propagate = true时,子记录器是否具有任何默认处理程序?还是回到祖先的处理程序,然后再回到根记录程序的处理程序,如果祖先/根记录程序没有处理程序,然后回到根记录程序lastResort处理程序?

如果传播设置为false,那么将为子记录器分配一些默认处理程序吗?

1 个答案:

答案 0 :(得分:0)

简短回答:logging.lastResort

长答案:

根据doc,如果未提供日志记录配置,则:

  

使用存储在logging.lastResort中的“最后处理者”输出事件。此内部处理程序不与任何记录器相关联,并且像StreamHandler一样,将事件描述消息写入sys.stderr的当前值(因此请考虑可能有效的任何重定向)。消息没有格式化,仅打印了裸事件描述消息。处理程序的级别设置为“警告”,因此将输出具有此严重级别的所有事件。

也根据logging source code

class Logger(Filterer):
    # ...
    def callHandlers(self, record):
        # ...
        # found is the number of handlers
        if (found == 0):
            if lastResort:
                if record.levelno >= lastResort.level:
                    lastResort.handle(record)

因此,无论是根记录器还是子记录器,如果没有处理程序,它将调用lastResortlastResort实际上是_StderrHandler(WARNING),它是:

class _StderrHandler(StreamHandler):
    """
    This class is like a StreamHandler using sys.stderr, but always uses
    whatever sys.stderr is currently set to rather than the value of
    sys.stderr at handler construction time.
    """
    def __init__(self, level=NOTSET):
        """
        Initialize the handler.
        """
        Handler.__init__(self, level)

    @property
    def stream(self):
        return sys.stderr

因此您可以看到它实际上是具有警告级别的 StreamHandler

相关问题