# Pytest 自动配置 Logger 与自定义 Handler 冲突问题 工作中遇到的一个坑记录一下免得下次又踩。## 背景项目中的 logger.py 实现了自定义日志配置python# common/logger.pyclass Log:def __init__(self):self.logger logging.getLogger()if not self.logger.handlers: # 防重复配置判断# 添加 FileHandler StreamHandlerlog Log().logger这个 if not self.logger.handlers 判断本来是为了防止重复添加 Handler写的时候觉得挺合理的。---## 正常场景通过 conftest 引入 Logger之前测试用例都走 conftest.py一直没出问题python# script/testcase/conftest.pyfrom common.logger import log # 在 conftest 中引入pytest.fixturedef some_fixture():log.info(测试开始)yield**执行时序**1. pytest 启动2. 加载 conftest.py → 触发 from common.logger import log3. 此时 root logger.handlers 为空自定义配置正常生效4. 后续第三方库初始化时root logger 已被占用说白了就是 conftest 加载得早抢在 pytest 自动配置之前把 handler 给占了。---## 异常场景直接在测试文件中引入 Logger后来写了个调试用例觉得没必要用 conftest就直接在用例里 importpython# debug_test.py 无 conftestimport allure, pytestfrom common.logger import logdef test_something():log.info(开始测试)结果一跑日志没输出了。**异常时序**1. pytest 启动2. 第三方库allure、pytest初始化向 root logger 添加 Handler3. 测试文件加载 → import allure/pytest → root logger.handlers 已非空4. 执行 from common.logger import log → if not handlers 条件为 False5. 自定义 Handler 配置被跳过原来 pytest 抢先一步把 root logger 给配了我们的防重复判断反而把自己给拦住了。---## 根因分析两个因素撞一起了| 因素 | 说明 ||------|------|| Pytest 自动配置 | pytest 及其插件会在执行过程中自动向 root logger 添加 handlers || 时序差异 | 自动配置发生在 conftest 加载之后测试文件加载之前 |**关键点**if not self.logger.handlers 本来是防重复的结果变成了防自己。---*记录于 2026-06-29*
Pytest 自动配置 Logger 与自定义 Handler 冲突问题
发布时间:2026/6/30 4:43:07
# Pytest 自动配置 Logger 与自定义 Handler 冲突问题 工作中遇到的一个坑记录一下免得下次又踩。## 背景项目中的 logger.py 实现了自定义日志配置python# common/logger.pyclass Log:def __init__(self):self.logger logging.getLogger()if not self.logger.handlers: # 防重复配置判断# 添加 FileHandler StreamHandlerlog Log().logger这个 if not self.logger.handlers 判断本来是为了防止重复添加 Handler写的时候觉得挺合理的。---## 正常场景通过 conftest 引入 Logger之前测试用例都走 conftest.py一直没出问题python# script/testcase/conftest.pyfrom common.logger import log # 在 conftest 中引入pytest.fixturedef some_fixture():log.info(测试开始)yield**执行时序**1. pytest 启动2. 加载 conftest.py → 触发 from common.logger import log3. 此时 root logger.handlers 为空自定义配置正常生效4. 后续第三方库初始化时root logger 已被占用说白了就是 conftest 加载得早抢在 pytest 自动配置之前把 handler 给占了。---## 异常场景直接在测试文件中引入 Logger后来写了个调试用例觉得没必要用 conftest就直接在用例里 importpython# debug_test.py 无 conftestimport allure, pytestfrom common.logger import logdef test_something():log.info(开始测试)结果一跑日志没输出了。**异常时序**1. pytest 启动2. 第三方库allure、pytest初始化向 root logger 添加 Handler3. 测试文件加载 → import allure/pytest → root logger.handlers 已非空4. 执行 from common.logger import log → if not handlers 条件为 False5. 自定义 Handler 配置被跳过原来 pytest 抢先一步把 root logger 给配了我们的防重复判断反而把自己给拦住了。---## 根因分析两个因素撞一起了| 因素 | 说明 ||------|------|| Pytest 自动配置 | pytest 及其插件会在执行过程中自动向 root logger 添加 handlers || 时序差异 | 自动配置发生在 conftest 加载之后测试文件加载之前 |**关键点**if not self.logger.handlers 本来是防重复的结果变成了防自己。---*记录于 2026-06-29*