关于python日志记录中的NOTSET

Tan*_*Woo 3 python logging

正如logger.setLevel文档所说:

创建记录器时,级别设置为NOTSET(当记录器是根记录器时会导致处理所有消息,或者当记录器是非root记录器时委托给父级).请注意,根记录器是使用级别WARNING创建的.

所以我想如果我用级别NOTSET创建一个根记录器,将显示调试和信息日志.

代码使用basicConfig将根记录器的级别设置为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')
Run Code Online (Sandbox Code Playgroud)

输出是:

DEBUG:root:debug
INFO:root:info
WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical
Run Code Online (Sandbox Code Playgroud)

但是如果我创建一个根记录器,并添加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')
Run Code Online (Sandbox Code Playgroud)

输出是:

warning
error
critical
Run Code Online (Sandbox Code Playgroud)

但我认为它也会输出调试和信息消息.

Tan*_*Woo 6

好的,我误解了,Logger's level并且Handler's Level在文档中:

与记录器对象一样,setLevel()方法指定将分派到适当目标的最低严重性.为什么有两个setLevel()方法?记录器中设置的级别确定将传递给其处理程序的消息的严重性.每个处理程序中设置的级别确定处理程序将发送哪些消息.

如果我将代码更改为此,则可以:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging

log = logging.getLogger()
log.setLevel(logging.NOTSET) # Set Logger's level to NOTSET, default is WARNING
#print "Logger's Level: ", log.level
hd = logging.StreamHandler()
hd.setLevel(logging.NOTSET)
#print "Handler's Level: ", hd.level
log.addHandler(hd)

log.debug('debug')
log.info('info')
log.warning('warning')
log.error('error')
log.critical('critical')
Run Code Online (Sandbox Code Playgroud)