为什么Python中logging日志消息晚于input输入提示消息显示?
现象原因解释
- 流与缓冲机制差异:
input()函数的提示文字默认输出到标准输出流(stdout),而logging模块默认将日志输出到标准错误流(stderr),两个为独立的输出流,各自拥有独立的缓冲区,刷新策略不同。input()函数在等待用户输入前,会主动强制刷新stdout缓冲区,确保提示文字第一时间展示在终端;而logging输出到stderr的内容如果还没达到缓冲区刷新阈值,就会延后输出,最终出现input提示早于日志显示的情况。 - logging默认配置过滤低级别日志:logging模块的默认日志级别为WARNING,示例中调用的是
log.debug(),debug级别低于WARNING,默认会被直接过滤不会输出。如果实际运行时已经调整过日志级别为DEBUG才看到日志,这条可以忽略;如果没有做过日志配置,input提示显示后才出现日志,本质是日志触发了默认Handler的懒加载逻辑,延迟了输出时机。
修复方案
统一输出流即可解决顺序问题,给logging配置显式输出到stdout,避免两个流的缓冲差异,示例配置:
import sys logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)
也可以在打印日志后主动刷新对应流,或者禁用输出流缓冲(不推荐,会降低性能)。
内容的提问来源于stack exchange,提问作者Cod1ngFree
相关产品推荐
相关产品推荐

