Python Logger的getEffectiveLevel()返回DEBUG但不打印DEBUG日志问题
日志级别修改为DEBUG后无日志输出的解决方案
问题分析
你遇到的情况是:明明已经将Logger和FileHandler的级别都修改为DEBUG,logger.getEffectiveLevel()也返回了DEBUG,但DEBUG级别的日志却没有出现在输出文件中。这并非级别设置不生效,而是FileHandler的缓冲机制导致日志未及时写入文件。
Python的FileHandler默认采用缓冲写入,当程序快速执行完成时,最后一条DEBUG日志可能还停留在缓冲区里,未被刷入磁盘文件,所以你看不到这条日志。
解决方法
有三种简单的方式可以解决这个问题:
1. 手动刷新并关闭Handler
在日志输出完成后,手动调用Handler的flush()和close()方法,强制将缓冲区内容写入文件:
import logging def test_change_log_level(): logger = logging.Logger("my-logger", logging.INFO) file_handler = logging.FileHandler(filename="out.log") file_handler.setLevel(logging.INFO) logger.addHandler(file_handler) logger.debug("should not be logged ...") logger.info("log level 1: %s", logging.getLevelName(logger.getEffectiveLevel())) logger.setLevel(logging.DEBUG) file_handler.setLevel(logging.DEBUG) logger.info("log level 2: %s", logging.getLevelName(logger.getEffectiveLevel())) logger.debug("debug level is effective") # 强制刷新缓冲区并关闭文件 file_handler.flush() file_handler.close() if __name__ == '__main__': test_change_log_level()
2. 创建FileHandler时启用自动刷新
在初始化FileHandler时添加flush=True参数,让每次日志写入后自动刷新缓冲区:
file_handler = logging.FileHandler(filename="out.log", flush=True)
3. 程序结束前调用日志模块的shutdown方法
在函数末尾或主程序中调用logging.shutdown(),该方法会自动关闭所有Handler并刷新缓冲区:
if __name__ == '__main__': test_change_log_level() logging.shutdown()
验证结果
修改后再次运行代码,out.log中会出现缺失的DEBUG日志:
log level 1: INFO log level 2: DEBUG debug level is effective
内容的提问来源于stack exchange,提问作者Boutran
相关产品推荐
相关产品推荐

