【发布时间】:2023-03-13 06:20:01
【问题描述】:
我试图掌握logger.setLevel 的影响和handler.setLevel 的影响之间的区别,其中logger 和handler 的创建方式如下:
import logging
def getLogger(name, loggerLevel, handlerLevel):
formatter = logging.Formatter('%(message)s')
handler = logging.StreamHandler()
handler.setLevel(handlerLevel)
handler.setFormatter(formatter)
logger = logging.getLogger(name)
logger.setLevel(loggerLevel)
logger.addHandler(handler)
return logger
注意handler 连接到logger。
这是official doc 对setLevel 的评价:
将此记录器的阈值设置为
level。比level不那么严重的日志消息将被忽略;严重性为level或更高级别的日志消息将由为该记录器提供服务的任何一个或多个处理程序发出,除非处理程序的level已设置为比level更高的严重性级别。
我没有完全理解这一点,所以我实现了以下脚本来测试所有可能的组合:
for loggerLevel in ['DEBUG', 'INFO', 'WARNING', 'ERROR']:
for handlerLevel in ['DEBUG', 'INFO', 'WARNING', 'ERROR']:
name = loggerLevel + '_' + handlerLevel
print('{}:'.format(name))
logger = getLogger(name,eval('logging.'+loggerLevel),eval('logging.'+handlerLevel))
logger.debug (' debug ')
logger.info (' info ')
logger.warning(' warning')
logger.error (' error ')
输出(见下文)证明了一件事 - 两者中较高的级别是确定行动过程的那个,无论哪个实体设置为该级别。 p>
所以我的问题是 - 为什么我们需要不止一个级别?
DEBUG_DEBUG:
debug
info
warning
error
DEBUG_INFO:
info
warning
error
DEBUG_WARNING:
warning
error
DEBUG_ERROR:
error
INFO_DEBUG:
info
warning
error
INFO_INFO:
info
warning
error
INFO_WARNING:
warning
error
INFO_ERROR:
error
WARNING_DEBUG:
warning
error
WARNING_INFO:
warning
error
WARNING_WARNING:
warning
error
WARNING_ERROR:
error
ERROR_DEBUG:
error
ERROR_INFO:
error
ERROR_WARNING:
error
ERROR_ERROR:
error
【问题讨论】:
标签: python python-3.x logging