You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:16:18