【发布时间】:2014-02-24 23:56:35
【问题描述】:
正如logger.setLevel 文档所说:
创建记录器时,级别设置为 NOTSET(当记录器是根记录器时会处理所有消息,或者当记录器是非根记录器时会委托给父级)。请注意,根记录器的创建级别为 WARNING。
所以我想如果我创建一个具有 NOTSET 级别的根记录器,将显示调试和信息日志。
代码使用basicConfig设置root logger的级别为NOTSET是对的:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
logging.basicConfig(level=logging.NOTSET)
log = logging.getLogger()
log.debug('debug')
log.info('info')
log.warning('warning')
log.error('error')
log.critical('critical')
输出是:
DEBUG:root:debug
INFO:root:info
WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical
但如果我创建一个根记录器,并为其添加具有 NOTSET 级别的处理程序,例如:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
log = logging.getLogger()
hd = logging.StreamHandler()
hd.setLevel(logging.NOTSET)
log.addHandler(hd)
log.debug('debug')
log.info('info')
log.warning('warning')
log.error('error')
log.critical('critical')
输出是:
warning
error
critical
但我认为它也会输出调试和信息消息。
【问题讨论】:
-
此测试中缺少的是: log.log(logging.NOTSET, 'notset') 尽管文档暗示了什么,它似乎没有将任何内容记录到任何地方。 log.handlers 在这里是 None 。但是,像下面的解决方案一样显式添加处理程序也不能专门解决日志级别为零的问题。
-
@DevPlayer 你是对的,现在看看这个问题,我认为用'logging.DEBUG'设置root logger就足够了,而且更好;
logging.NOTSET不是一个有效的级别,它用于委托。 -
这很奇怪,文档中的哪里记录了这种行为?这让我一整天都感到困惑。