Python logging.basicConfig 设置日志级别无效的排查与修复
本文分析Python中logging.basicConfig设置日志级别失败的原因。当其他库在导入时已初始化根日志处理器,basicConfig将跳过配置。解决方案是确保在调用basicConfig前,root.handlers为空,或将配置语句置于所有import之前。
问题描述
一、问题描述
在Python开发过程中,开发者经常使用logging模块进行日志记录。参考官方文档示例,通常通过调用logging.basicConfig()并指定level参数来设定日志级别。
import logging
logging.basicConfig(level=logging.INFO)
然而,在实际项目应用中,这种配置方式有时无法生效,导致INFO级别及以下的日志信息无法打印输出。一种直接且有效的解决策略是将配置logging.basicConfig()的两行代码移至文件最顶端,确保其位于所有其他import语句之前执行。
具体示例如下。
# encoding=utf8
import logging
logging.basicConfig(level=logging.INFO)
# other import
import ...
# your code
if __name__ == '__main__':
pass
问题解释
二、问题解释
我们可以查看logging模块中basicConfig函数的部分源码实现:
def basicConfig(**kwargs):
_acquireLock()
try:
if len(root.handlers) == 0:
filename = kwargs.get("filename")
if filename:
mode = kwargs.get("filemode", 'a')
hdlr = FileHandler(filename, mode)
else:
stream = kwargs.get("stream")
hdlr = StreamHandler(stream)
fs = kwargs.get("format", BASIC_FORMAT)
dfs = kwargs.get("datefmt", None)
fmt = Formatter(fs, dfs)
hdlr.setFormatter(fmt)
root.addHandler(hdlr)
level = kwargs.get("level")
if level is not None:
root.setLevel(level)
finally:
_releaseLock()
从源码逻辑可以看出,函数首先检查root.handlers列表的长度。只有当root.handlers长度为0时,才会创建新的Handler(如FileHandler或StreamHandler),设置格式器,并将其添加到根日志器中,最后根据传入的level参数设置根日志器的级别。
如果在调用basicConfig之前,代码中已经import了其他第三方库,且这些库内部也引用了logging模块并进行了初始化操作,那么root.handlers可能已经被填充。此时再次调用basicConfig,由于len(root.handlers)不为0,配置过程会被跳过,导致日志级别设置失败。
此外,logging模块默认的日志级别为logging.UNSET。在此默认状态下,只有WARNING级别及以上的日志消息会被打印输出。
以上关于Python中logging.basicConfig设置日志级别无效的排查与修复方法,希望能为开发者提供参考。如有更多疑问或建议,欢迎继续探讨。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













