如何为Pytest配置细粒度日志:仅开启自研代码调试日志
解决Pytest中精准控制自研代码与第三方库日志级别的方案
方案一:使用logging配置文件实现细粒度控制
你可以通过编写logging.conf配置文件,单独指定自研代码和第三方库的日志级别,再让Pytest加载这个配置。
示例配置文件(logging.conf)
[loggers] keys=root,myapp,boto3,botocore [handlers] keys=consoleHandler [formatters] keys=simpleFormatter # 根日志器设为INFO,避免全局输出DEBUG日志 [logger_root] level=INFO handlers=consoleHandler # 自研代码的日志器(替换为你的代码包名/日志器前缀) [logger_myapp] level=DEBUG handlers=consoleHandler qualname=myapp propagate=0 # 阻止日志传播到根日志器,避免重复输出 # 第三方库日志器:禁用DEBUG,只保留WARNING及以上级别 [logger_boto3] level=WARNING handlers=consoleHandler qualname=boto3 propagate=0 [logger_botocore] level=WARNING handlers=consoleHandler qualname=botocore propagate=0 # 控制台处理器配置 [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,) # 日志格式定义 [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt=%Y-%m-%d %H:%M:%S
让Pytest加载配置文件
运行测试时通过命令行指定配置文件:
pytest --logging-config=logging.conf
或者在项目根目录的conftest.py中添加自动加载逻辑:
import logging.config def pytest_configure(config): # disable_existing_loggers=False 避免禁用已存在的第三方日志器 logging.config.fileConfig('logging.conf', disable_existing_loggers=False)
方案二:在conftest.py中直接代码控制
如果不需要复杂的日志格式,直接在conftest.py中通过代码设置各个日志器的级别更快捷:
import logging def pytest_configure(config): # 为自研代码的日志器开启DEBUG级别(替换成你的代码包名/日志器名称) my_app_logger = logging.getLogger('myapp') my_app_logger.setLevel(logging.DEBUG) my_app_logger.propagate = True # 可选:允许日志传到根处理器输出 # 禁用第三方库的DEBUG日志,涵盖boto3关联的依赖日志器 third_party_loggers = ['boto3', 'botocore', 'urllib3', 's3transfer'] for logger_name in third_party_loggers: logger = logging.getLogger(logger_name) logger.setLevel(logging.WARNING) logger.propagate = False # 阻止第三方日志传到根日志器,减少冗余
关键注意事项
- 自研代码中要统一使用
logging.getLogger(__name__)创建日志器,这样子模块的日志器会自动继承父包(如myapp)的级别设置。 - 如果第三方库有多个关联日志器,需要把这些都加入控制列表,避免遗漏冗余日志。
内容的提问来源于stack exchange,提问作者Achim
相关产品推荐
相关产品推荐

