使用pytest测试日志消息并屏蔽控制台日志输出的问题
问题原因解析
自定义Logger的独立处理器未被接管:pytest的caplog默认仅接管root logger的配置。如果你的函数使用了自定义Logger(比如
logging.getLogger("my_func_logger")创建的实例),且该Logger手动添加了StreamHandler(控制台输出处理器),caplog不会自动移除或覆盖这些自定义处理器,日志会绕过pytest配置直接输出到控制台。日志级别配置未覆盖目标Logger:
- 仅设置
log-cli=False或调整log-cli-level只是关闭pytest自带的控制台日志输出,不会影响代码中自定义Logger自身的级别和处理器配置。如果目标Logger的级别低于你设置的cli级别,或者它自己绑定了StreamHandler,日志依然会打印。 - 比如你把
log-cli-level设为INFO,但自定义Logger的级别是DEBUG,且自带StreamHandler,那么DEBUG级别的日志还是会输出。
- 仅设置
非logging模块的输出干扰:如果「Watch out!」不是通过
logging模块生成的,而是用print()语句直接输出,那么caplog和pytest的日志配置都无法控制这类输出,它会直接显示在控制台。Logger传播属性导致的重复输出:自定义Logger默认
propagate=True,会将日志消息向上传播到父级Logger(直到root Logger)。如果root Logger本身配置了StreamHandler,即便caplog接管了自定义Logger,传播的日志还是会通过root的处理器输出到控制台。
内容的提问来源于stack exchange,提问作者Jean-Francois T.
相关产品推荐
相关产品推荐

