我了解到,如果未使用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,那么将为子记录器分配一些默认处理程序吗?
答案 0 :(得分:0)
简短回答:logging.lastResort
长答案:
根据doc,如果未提供日志记录配置,则:
使用存储在logging.lastResort中的“最后处理者”输出事件。此内部处理程序不与任何记录器相关联,并且像StreamHandler一样,将事件描述消息写入sys.stderr的当前值(因此请考虑可能有效的任何重定向)。消息没有格式化,仅打印了裸事件描述消息。处理程序的级别设置为“警告”,因此将输出具有此严重级别的所有事件。
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
因此您可以看到它实际上是具有警告级别的 StreamHandler 。