如何保留自定义DEBUG日志同时屏蔽Loguru框架下的冗余日志
解决自动化测试框架中第三方日志干扰的方案
1. 精准控制pytest的日志捕获范围
Captured log setup/call/teardown是pytest自动捕获的第三方日志,可以通过配置限制pytest仅捕获你自己的日志输出,屏蔽第三方内容:
方法1:修改pytest.ini配置文件
在项目根目录的pytest.ini中添加以下内容:
[pytest] log_cli = true log_cli_level = DEBUG log_cli_filter = pages.actions.*,your.custom.logger.*
其中pages.actions.*对应你示例中pages.actions.signin_page的日志器前缀,your.custom.logger.*替换为你自己的其他日志器标识,这样pytest只会捕获指定范围内的日志,第三方的urllib3、faker、WDM日志不会被打印为Captured log系列内容。
方法2:在conftest.py中动态配置
若不想使用配置文件,可在conftest.py通过钩子函数设置:
import pytest def pytest_configure(config): config.option.log_cli = True config.option.log_cli_level = "DEBUG" # 仅过滤自己的日志器 config.option.log_cli_filter = "pages.actions.*,your.custom.logger.*"
2. 直接屏蔽第三方日志器输出
不管使用logging还是Loguru,都可以直接给第三方日志器设置更高级别或禁止传播:
针对urllib3、faker
import logging for logger_name in ["urllib3", "faker"]: logger = logging.getLogger(logger_name) logger.setLevel(logging.WARNING) # 禁止日志向父级传播 logger.propagate = False
针对WDM
之前设置环境变量的方式可能未生效,直接操作WDM的日志器:
logging.getLogger("WDM").setLevel(logging.NOTSET) # 或彻底禁用传播 logging.getLogger("WDM").propagate = False
如果用Loguru,还可以通过过滤器拦截WDM日志:
from loguru import logger import sys logger.remove() logger.add( sys.stderr, level="DEBUG", filter=lambda record: "WDM" not in record["message"] and not record["message"].startswith("[WDM]") )
3. Loguru专属过滤方案
若全程使用Loguru,可利用其过滤功能仅保留你自己的日志:
from loguru import logger import sys # 清除默认输出处理器 logger.remove() # 添加自定义过滤的输出,仅保留指定模块的日志 logger.add( sys.stderr, level="DEBUG", filter=lambda record: record["name"].startswith("pages.actions.") )
这样只有pages.actions前缀的日志会被打印,第三方日志全被过滤,同时保留你的DEBUG级别日志。
效果验证
执行测试时,你自定义的2022-11-30 15:11:30 - pages.actions.signin_page - DEBUG - Click on signin button这类日志会正常显示,urllib3、faker、WDM的日志以及Captured log系列内容会被隐藏,错误回溯信息也不会丢失。
内容的提问来源于stack exchange,提问作者Krematory
相关产品推荐
相关产品推荐

