Python 中 logging 的 setlevel 函数未生效

参考自:

  1. python 中logger setlevel没有生效
  2. logging — Python 的日志记录工具

问题分析

在官方文档中,对于 setLevel 的解释为:

setLevel(level)
给记录器设置阈值为 level 。日志等级小于 level 会被忽略。严重性为 level 或更高的日志消息将由该记录器的任何一个或多个处理器发出,除非将处理器的级别设置为比 level 更高的级别。
创建记录器时,级别默认设置为 NOTSET (当记录器是根记录器时,将处理所有消息;如果记录器不是根记录器,则将委托给父级)。请注意,根记录器的默认级别为 WARNING 。
委派给父级的意思是如果一个记录器的级别设置为 NOTSET,将遍历其祖先记录器,直到找到级别不是 NOTSET 的记录器,或者到根记录器为止。
如果发现某个父级的级别不是 NOTSET ,那么该父级的级别将被视为发起搜索的记录器的有效级别,并用于确定如何处理日志事件。
如果搜索到达根记录器,并且其级别为 NOTSET,则将处理所有消息。否则,将使用根记录器的级别作为有效级别。

即在 logging 中,logger 本身的 level 等级优先于其处理器 level 等级,且 Logger’s level 的默认等级一般为 warning

所以虽然在handler中setlervel了,但如果 Logger’s level 高于 Handler’s Level ,则低于 Logger’s level 的日志仍会被丢弃

解决方式

在设置处理器级别之前先进行记录器级别的设置
eg: logger.setLevel(logging.DEBUG)

import logging

# log 配置
logger = logging.getLogger('记录器命名')
# 设置记录器等级,以防丢弃下方处理器需要的日志
logger.setLevel(logging.DEBUG)

# warning 及以上日志等级会被上传到终端输出
c_handler = logging.StreamHandler()
c_handler.setLevel(logging.WARNING)
c_format = logging.Formatter('%(asctime)s - %(module)s, %(lineno)s - %(levelname)s: %(message)s')
c_handler.setFormatter(c_format)
logger.addHandler(c_handler)

# debug 及以上日志等级会被写入到日志文件
f_handler = logging.FileHandler('SecTracy.log')
f_handler.setLevel(logging.DEBUG)
f_format = logging.Formatter('%(asctime)s - %(module)s, %(lineno)s - %(levelname)s: %(message)s')
f_handler.setFormatter(f_format)
logger.addHandler(f_handler)

你可能感兴趣的:(python)