繁体   English   中英

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

[英]What is the default handler for the child logger?

我知道根记录器具有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处理程序?

如果将propagate 设置为false,那么是否会为子记录器分配一些默认处理程序?

简短回答: logging.lastResort

长答案:

根据文档,如果没有提供日志配置,那么:

事件是 output,使用存储在 logging.lastResort 中的“最后的处理程序”。 这个内部处理程序不与任何记录器相关联,并且像 StreamHandler 一样将事件描述消息写入 sys.stderr 的当前值(因此尊重任何可能有效的重定向)。 没有对消息进行格式化 - 只打印裸事件描述消息。 处理程序的级别设置为 WARNING,因此此严重性和更高严重性的所有事件将是 output。

还根据日志记录源代码

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)

因此,如果没有处理程序,它将调用lastResort ,无论它是根记录器还是子记录器。 lastResort实际上是_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

所以你可以看到它实际上是一个带有 WARNING 级别的 StreamHandler

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM