为什么Python logging模块在pdb调试时无法将日志输出到屏幕?
pdb环境下logging.info无法输出到屏幕的原因
核心原因
logging.basicConfig() 存在内置执行限制:只要根logger已经挂载了任意handler,该函数会直接跳过全部配置流程,不会追加用户传入的新handler、也不会修改日志级别。
- 独立Python控制台场景:解释器刚启动时,logging根logger默认没有挂载任何handler,因此传入的文件输出、屏幕流handler都能被正常挂载,日志可以同时写入文件、打印到终端。
- pdb调试场景:在你进入pdb交互断点前,pdb调试器自身为了输出调试信息,已经提前给根logger挂载了内部使用的handler。此时你再调用
basicConfig,函数检测到已有handler存在,直接跳过所有配置步骤,你定义的两个handler根本没有被绑定到根logger上,自然不会出现屏幕输出。
验证方式
在pdb交互环境中先执行以下代码,可以看到根logger的handler列表非空,证实提前初始化的情况:
import logging print(logging.root.handlers)
可行解决方案
方案1:手动配置根logger(推荐)
不依赖basicConfig,直接操作根logger完成配置,不受已有handler的影响:
import logging root_logger = logging.getLogger() root_logger.setLevel(logging.INFO) log_formatter = logging.Formatter(' %(message)s') # 挂载文件输出handler file_handler = logging.FileHandler('./filename.log') file_handler.setFormatter(log_formatter) root_logger.addHandler(file_handler) # 挂载终端流输出handler stream_handler = logging.StreamHandler() stream_handler.setFormatter(log_formatter) root_logger.addHandler(stream_handler) # 测试日志输出 logging.info('Hey, this is working!')
方案2:清空已有handler后再调用basicConfig
如果要沿用原来的basicConfig写法,先清空根logger上提前挂载的所有handler即可:
import logging # 清空根logger已存在的所有handler for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) # 执行原有配置逻辑 level = logging.INFO format = ' %(message)s' handlers = [logging.FileHandler('./filename.log'), logging.StreamHandler()] logging.basicConfig(level = level, format = format, handlers = handlers) # 测试日志输出 logging.info('Hey, this is working!')
内容的提问来源于stack exchange,提问作者Charlie Parker
相关产品推荐
相关产品推荐

