正如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)
但我认为它也会输出调试和信息消息.
好的,我误解了,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)