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)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythonlogging模块提供了一种灵活且可配置的方式来记录信息。通过使用不同的handler、formatter和logger对象的组合,可以控制日志消息的输出方式、输出位置和格式。使用logging模块可以在代码记录各种级别的消息,例如调试信息、警告、错误和致命错误。下面是一个简单的例子: ```python import logging # 创建一个logger logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # 创建一个文件handler,用于写入日志文件 fh = logging.FileHandler('mylog.log') fh.setLevel(logging.DEBUG) # 创建一个控制台handler,用于输出到控制台 ch = logging.StreamHandler() ch.setLevel(logging.ERROR) # 定义日志输出格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) ch.setFormatter(formatter) # 将handler添加到logger logger.addHandler(fh) logger.addHandler(ch) # 记录日志 logger.debug('debug message') logger.info('info message') logger.warning('warning message') logger.error('error message') logger.critical('critical message') ``` 上面的代码创建了一个logger对象,并添加了一个文件handler和一个控制台handler。文件handler会将日志信息写入到指定的文件,控制台handler会将错误级别以上的日志信息输出到控制台。该例子还定义了日志信息的格式,最后通过调用logger对象的各个方法来记录不同级别的日志信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值