![](/img/trans.png)
[英]What is the default setting (log handler, log level, log format) for child logger?
[英]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.