Logger的setLevel与关联Handler的setLevel的作用差异解析
Logger.setLevel vs Handler.setLevel:彻底搞懂两者的差异
嘿,这个问题我当初刚上手日志配置的时候也纠结过,其实核心就是两个不同层级的过滤门槛,一个管logger要不要“接收”日志,一个管handler要不要“输出”日志。咱们一步步拆解:
一、Logger.setLevel:日志的第一道「入口门槛」
官方文档说明:将此记录器的阈值设置为level。严重程度低于level的日志消息将被忽略;严重程度达到或高于level的日志消息将由为此记录器提供服务的一个或多个handler输出……
简单说,logger的级别是第一道过滤网:
- 当你调用
logger.debug("xxx")或者logger.error("xxx")这类日志方法时,首先会检查这条日志的级别是否≥logger设置的level。 - 如果低于这个级别,这条日志直接就被logger“拦在门外”了,根本不会传到后面绑定的handler那里。
- 只有级别达标了,才会把日志消息分发给所有关联的handler去处理。
举个直观的例子:要是你给logger设了INFO级别,那DEBUG级别的日志连handler的面都见不着,直接就没了。
二、Handler.setLevel:日志的第二道「出口门槛」
handler的级别是第二道过滤网:
- 只有当logger放行的日志传到handler这里后,handler才会用自己的level再做一次检查。
- 如果日志级别≥handler的level,才会被输出(比如打印到控制台、写入日志文件);如果低于,handler就直接把这条日志丢弃,不会对外输出。
咱们用代码实际验证下,更清楚:
import logging # 创建自定义logger logger = logging.getLogger("my_demo_logger") logger.setLevel(logging.INFO) # logger的门槛设为INFO # 创建控制台handler并绑定到logger console_handler = logging.StreamHandler() console_handler.setLevel(logging.ERROR) # handler的门槛设为ERROR logger.addHandler(console_handler) # 测试不同级别的日志 logger.debug("这是一条DEBUG级别的日志") # 低于logger的INFO,直接被拦截 logger.info("这是一条INFO级别的日志") # 过了logger,但低于handler的ERROR,handler不输出 logger.error("这是一条ERROR级别的日志") # 同时过了logger和handler的门槛,最终打印到控制台
运行这段代码,你会发现只有ERROR级别的日志会被输出,前两个要么被logger拦了,要么被handler拦了。
三、核心差异总结
- Logger.setLevel:决定哪些日志能进入整个日志处理流程(本质是「要不要接收这条日志」的问题)
- Handler.setLevel:决定已经进入流程的日志中,哪些能最终被输出(本质是「要不要把这条日志发出去」的问题)
额外提个小细节:如果logger没有手动设置level,它会继承父logger的级别;同理handler如果没设level,默认是NOTSET(相当于不做过滤,只要logger放行的日志都会被输出)。
内容的提问来源于stack exchange,提问作者goodvibration
相关产品推荐
相关产品推荐

