一、前言在接口自动化测试PytestRequests 项目中日志是项目落地必不可少的一环用例报错排查、接口请求参数留存、线上问题溯源、Allure 报告日志绑定都依赖logging模块。Python 内置logging是标准库无需额外 pip 安装相比 print 打印可分级管控、落地文件、自定义格式、多渠道输出控制台 文件是自动化项目工业级日志首选。本文从基础语法→4 大组件→实战分层→自动化项目落地规范完整讲解适配接口测试项目场景。二、logging 基础认知2.1 模块作用分级打印日志DEBUG 调试、INFO 流程、WARN 异常提醒、ERROR 接口报错、CRITICAL 致命宕机可灵活开关日志级别上线关闭 DEBUG 减少冗余日志持久化存储接口自动化用例执行日志落地.log文件用例失败时不用重跑脚本通过历史日志回溯入参 / 返回报文多输出渠道同时控制台实时打印 本地文件存档调试看控制台复盘查日志文件自定义日志格式记录时间、报错代码行号、模块名接口报错快速定位代码位置对接 Allure 测试报告把自动化用例日志嵌入 Allure 可视化报告报告内直接查看接口执行日志。2.2 日志 5 个级别优先级从小到大日志级别常量标识使用场景接口测试落地DEBUGlogging.DEBUG(10)调试打印接口请求 URL、入参、header开发调试脚本使用INFOlogging.INFO(20)流程正常接口调用成功、用例执行通过记录正常业务流程WARNINGlogging.WARNING(30)告警接口返回非预期状态码但未报错如返回 201 非 200、参数兼容提醒ERRORlogging.ERROR(40)错误接口请求抛异常、断言失败、数据库查询报错CRITICALlogging.CRITICAL(50)致命数据库连接失败、全局配置加载异常、整个测试套件无法启动规则设置某个级别后大于等于该级别日志才会被输出例级别设 INFODEBUG 日志直接过滤不打印。三、logging 四种基础用法对应文档 4 个示例补充细节示例 1全局简易配置 basicConfig快速上手import logging # 全局配置日志级别为INFO低于INFO(DEBUG)直接过滤 logging.basicConfig(levellogging.INFO) # 5级日志打印 logging.debug(【DEBUG】接口调试请求地址http://xxx/login) logging.info(【INFO】接口正常登录接口调用成功) logging.warning(【WARN】接口告警返回码非标准200为201) logging.error(【ERROR】接口异常断言失败预期code0实际code999) logging.critical(【CRITICAL】致命错误数据库连接失败用例终止)输出结果DEBUG 日志被过滤只输出 INFO/WARN/ERROR/CRITICALINFO:root:【INFO】接口正常登录接口调用成功 WARNING:root:【WARN】接口告警返回码非标准200为201 ERROR:root:【ERROR】接口异常断言失败预期code0实际code999 CRITICAL:root:【CRITICAL】致命错误数据库连接失败用例终止缺点basicConfig 是全局 root 日志多模块项目日志混乱企业自动化项目不推荐优先自定义 Logger 对象。示例 2自定义 Logger 对象控制台输出推荐项目使用logging.getLogger(__name__)每个模块创建独立日志对象__name__自动获取当前模块名多文件项目可区分哪个模块打出的日志。import logging # 1.获取日志实例推荐每个py文件单独创建logger logger logging.getLogger(__name__) # 2.设置当前logger日志级别DEBUG所有级别日志全部放行 logger.setLevel(logging.DEBUG) if __name__ __main__: logger.debug(【DEBUG】调试新增用户接口入参{name:test}) logger.info(【INFO】新增用户接口执行成功) logger.warning(【WARN】用户手机号格式非常规11位) logger.error(【ERROR】新增用户数据库插入报错) logger.critical(【CRITICAL】全局配置yaml读取失败)补充此时默认控制台输出无自定义格式是接口测试单文件脚本常用写法。示例 3自定义 LoggerFileHandler 落地日志到文件FileHandler文件处理器把日志写入本地 log 文件接口自动化用例执行后留存执行记录。import logging # 1.创建日志对象 logger logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 2.创建文件处理器日志写入test.log file_handler logging.FileHandler(filenametest.log, encodingutf-8) # 3.处理器绑定到logger logger.addHandler(file_handler) if __name__ __main__: logger.debug(【DEBUG】调试新增用户接口入参{name:test}) logger.info(【INFO】新增用户接口执行成功) logger.warning(【WARN】用户手机号格式非常规11位) logger.error(【ERROR】新增用户数据库插入报错) logger.critical(【CRITICAL】全局配置yaml读取失败)运行后项目目录生成test.log所有日志持久化写入文件补充参数encodingutf-8避免中文日志乱码自动化项目必加。示例 4Formatter 自定义日志格式自动化项目标准格式Formatter自定义日志输出模板配置时间、日志级别、文件名、行号接口报错精准定位代码。常用格式占位符说明占位符含义测试项目用处%(asctime)s日志打印时间查看接口报错发生时间%(levelname)s日志级别快速区分报错严重程度%(name)slogger 名称 (模块名)定位哪个 py 文件模块输出日志%(filename)s当前文件名具体哪个文件报错%(funcName)s函数名哪个函数抛出异常%(lineno)d代码行号精准定位报错行数%(message)s日志正文自定义打印内容接口入参 / 返回值完整带格式 文件落地代码import logging # 1.初始化logger logger logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 2.定义日志格式自动化项目通用格式 log_format logging.Formatter( fmt%(asctime)s | %(levelname)-8s | %(name)s | %(filename)s:%(lineno)d | %(message)s, datefmt%Y-%m-%d %H:%M:%S # 自定义时间格式 ) # 3.文件处理器绑定格式 file_handler logging.FileHandler(test.log, encodingutf-8) file_handler.setFormatter(log_format) logger.addHandler(file_handler) # 【拓展】新增控制台处理器同时控制台文件双输出自动化刚需 console_handler logging.StreamHandler() console_handler.setFormatter(log_format) logger.addHandler(console_handler) if __name__ __main__: logger.debug(【DEBUG】调试新增用户接口入参{name:test}) logger.info(【INFO】新增用户接口执行成功) logger.error(【ERROR】新增用户数据库插入报错)输出样例2025-08-22 15:30:22 | DEBUG | __main__ | test.py:22 | 【DEBUG】调试新增用户接口入参{name:test} 2025-08-22 15:30:22 | INFO | __main__ | test.py:23 | 【INFO】新增用户接口执行成功四、logging 四大核心组件接口测试进阶重点组件类名作用自动化项目用途日志器Logger程序调用入口 (logger.info/error)每个模块独立实例各个接口用例文件导入使用隔离模块日志处理器Handler控制日志去向文件 / 控制台 / 网络FileHandler 存文件、StreamHandler 控制台打印格式器Formatter定义日志输出模板规范日志格式方便后续日志检索过滤器Filter自定义过滤规则按需过滤日志过滤敏感数据手机号、密码不落地日志核心逻辑Logger→绑定多个 Handler→每个 Handler 绑定 Formatter实现一套日志多渠道、多格式输出。五、接口自动化项目落地封装重点Pytest 专用日志工具类在自动化项目中单独新建common/log_utils.py封装全局日志全项目所有接口用例统一调用工业级规范# common/log_utils.py import logging import os from logging.handlers import RotatingFileHandler # 项目根目录生成logs文件夹 BASE_PATH os.path.dirname(os.path.dirname(__file__)) LOG_PATH os.path.join(BASE_PATH, logs) if not os.path.exists(LOG_PATH): os.mkdir(LOG_PATH) LOG_FILE os.path.join(LOG_PATH, autotest.log) def get_logger(nameautotest): 封装全局日志对象全项目统一调用 logger logging.getLogger(name) logger.setLevel(logging.DEBUG) # 避免重复添加handler多次导入模块重复打印bug if not logger.handlers: # 1.自定义格式 fmt %(asctime)s | %(levelname)-7s | %(name)s | %(filename)s:%(lineno)d | %(message)s formater logging.Formatter(fmtfmt, datefmt%Y-%m-%d %H:%M:%S) # 2.滚动文件处理器日志过大自动拆分防止单个log文件过大RotatingFileHandler # maxBytes单个文件50MBbackupCount保留3个备份日志 file_handle RotatingFileHandler(LOG_FILE, maxBytes50*1024*1024, backupCount3, encodingutf-8) file_handle.setFormatter(formater) #3.控制台处理器 console_handle logging.StreamHandler() console_handle.setFormatter(formater) #绑定处理器 logger.addHandler(file_handle) logger.addHandler(console_handle) return logger # 全局单例日志对象项目直接导入 logger get_logger()接口用例中使用示例test_api.py# 导入封装好的全局logger from common.log_utils import logger import requests def test_login_api(): url http://xxx/api/login payload {username:admin,password:123456} logger.info(f【登录接口】请求地址{url}请求参数{payload}) res requests.post(url,jsonpayload) logger.info(f【登录接口】接口返回{res.json()}) # 断言失败打印ERROR日志 try: assert res.json()[code] 0 except AssertionError as e: logger.error(f【登录接口断言失败】预期code0实际{res.json()[code]}) raise e六、自动化拓展日志对接 Allure 测试报告在 PytestAllure 项目中把 logging 日志嵌入测试报告用例详情页直接查看执行日志实现方式conftest.py 全局捕获日志# conftest.py import allure from common.log_utils import logger import logging pytest.fixture(autouseTrue) def attach_log_to_allure(): 自动将用例执行日志附加到Allure报告 class AllureHandler(logging.Handler): def emit(self, record): msg self.format(record) allure.attach(msg, name用例执行日志, attachment_typeallure.attachment_type.TEXT) # 临时绑定处理器 allure_handler AllureHandler() logger.addHandler(allure_handler) yield logger.removeHandler(allure_handler)运行 pytest 生成 allure 报告后打开报告→对应用例→附件即可查看当前用例完整日志。七、补充避坑知识点专栏实用踩坑总结重复打印日志多次导入 logger 重复 addHandler日志重复输出解决封装时判断if not logger.handlers再新增处理器中文乱码FileHandler 必须指定encodingutf-8日志文件无限变大不用原生 FileHandler改用RotatingFileHandler/TimedRotatingFileHandler实现日志拆分、过期清理上线环境优化正式环境修改日志级别为 INFO关闭 DEBUG 调试日志减少磁盘占用。八、总结logging 是 Python 接口自动化项目的日志基石从简易使用→自定义封装→项目落地→Allure 集成全链路覆盖所有自动化项目规范必须统一封装日志工具类摒弃零散 print 打印方便问题定位、用例复盘、报告可视化是接口测试工程师必备编码能力。
10.logging 日志详解
发布时间:2026/6/4 22:47:50
一、前言在接口自动化测试PytestRequests 项目中日志是项目落地必不可少的一环用例报错排查、接口请求参数留存、线上问题溯源、Allure 报告日志绑定都依赖logging模块。Python 内置logging是标准库无需额外 pip 安装相比 print 打印可分级管控、落地文件、自定义格式、多渠道输出控制台 文件是自动化项目工业级日志首选。本文从基础语法→4 大组件→实战分层→自动化项目落地规范完整讲解适配接口测试项目场景。二、logging 基础认知2.1 模块作用分级打印日志DEBUG 调试、INFO 流程、WARN 异常提醒、ERROR 接口报错、CRITICAL 致命宕机可灵活开关日志级别上线关闭 DEBUG 减少冗余日志持久化存储接口自动化用例执行日志落地.log文件用例失败时不用重跑脚本通过历史日志回溯入参 / 返回报文多输出渠道同时控制台实时打印 本地文件存档调试看控制台复盘查日志文件自定义日志格式记录时间、报错代码行号、模块名接口报错快速定位代码位置对接 Allure 测试报告把自动化用例日志嵌入 Allure 可视化报告报告内直接查看接口执行日志。2.2 日志 5 个级别优先级从小到大日志级别常量标识使用场景接口测试落地DEBUGlogging.DEBUG(10)调试打印接口请求 URL、入参、header开发调试脚本使用INFOlogging.INFO(20)流程正常接口调用成功、用例执行通过记录正常业务流程WARNINGlogging.WARNING(30)告警接口返回非预期状态码但未报错如返回 201 非 200、参数兼容提醒ERRORlogging.ERROR(40)错误接口请求抛异常、断言失败、数据库查询报错CRITICALlogging.CRITICAL(50)致命数据库连接失败、全局配置加载异常、整个测试套件无法启动规则设置某个级别后大于等于该级别日志才会被输出例级别设 INFODEBUG 日志直接过滤不打印。三、logging 四种基础用法对应文档 4 个示例补充细节示例 1全局简易配置 basicConfig快速上手import logging # 全局配置日志级别为INFO低于INFO(DEBUG)直接过滤 logging.basicConfig(levellogging.INFO) # 5级日志打印 logging.debug(【DEBUG】接口调试请求地址http://xxx/login) logging.info(【INFO】接口正常登录接口调用成功) logging.warning(【WARN】接口告警返回码非标准200为201) logging.error(【ERROR】接口异常断言失败预期code0实际code999) logging.critical(【CRITICAL】致命错误数据库连接失败用例终止)输出结果DEBUG 日志被过滤只输出 INFO/WARN/ERROR/CRITICALINFO:root:【INFO】接口正常登录接口调用成功 WARNING:root:【WARN】接口告警返回码非标准200为201 ERROR:root:【ERROR】接口异常断言失败预期code0实际code999 CRITICAL:root:【CRITICAL】致命错误数据库连接失败用例终止缺点basicConfig 是全局 root 日志多模块项目日志混乱企业自动化项目不推荐优先自定义 Logger 对象。示例 2自定义 Logger 对象控制台输出推荐项目使用logging.getLogger(__name__)每个模块创建独立日志对象__name__自动获取当前模块名多文件项目可区分哪个模块打出的日志。import logging # 1.获取日志实例推荐每个py文件单独创建logger logger logging.getLogger(__name__) # 2.设置当前logger日志级别DEBUG所有级别日志全部放行 logger.setLevel(logging.DEBUG) if __name__ __main__: logger.debug(【DEBUG】调试新增用户接口入参{name:test}) logger.info(【INFO】新增用户接口执行成功) logger.warning(【WARN】用户手机号格式非常规11位) logger.error(【ERROR】新增用户数据库插入报错) logger.critical(【CRITICAL】全局配置yaml读取失败)补充此时默认控制台输出无自定义格式是接口测试单文件脚本常用写法。示例 3自定义 LoggerFileHandler 落地日志到文件FileHandler文件处理器把日志写入本地 log 文件接口自动化用例执行后留存执行记录。import logging # 1.创建日志对象 logger logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 2.创建文件处理器日志写入test.log file_handler logging.FileHandler(filenametest.log, encodingutf-8) # 3.处理器绑定到logger logger.addHandler(file_handler) if __name__ __main__: logger.debug(【DEBUG】调试新增用户接口入参{name:test}) logger.info(【INFO】新增用户接口执行成功) logger.warning(【WARN】用户手机号格式非常规11位) logger.error(【ERROR】新增用户数据库插入报错) logger.critical(【CRITICAL】全局配置yaml读取失败)运行后项目目录生成test.log所有日志持久化写入文件补充参数encodingutf-8避免中文日志乱码自动化项目必加。示例 4Formatter 自定义日志格式自动化项目标准格式Formatter自定义日志输出模板配置时间、日志级别、文件名、行号接口报错精准定位代码。常用格式占位符说明占位符含义测试项目用处%(asctime)s日志打印时间查看接口报错发生时间%(levelname)s日志级别快速区分报错严重程度%(name)slogger 名称 (模块名)定位哪个 py 文件模块输出日志%(filename)s当前文件名具体哪个文件报错%(funcName)s函数名哪个函数抛出异常%(lineno)d代码行号精准定位报错行数%(message)s日志正文自定义打印内容接口入参 / 返回值完整带格式 文件落地代码import logging # 1.初始化logger logger logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 2.定义日志格式自动化项目通用格式 log_format logging.Formatter( fmt%(asctime)s | %(levelname)-8s | %(name)s | %(filename)s:%(lineno)d | %(message)s, datefmt%Y-%m-%d %H:%M:%S # 自定义时间格式 ) # 3.文件处理器绑定格式 file_handler logging.FileHandler(test.log, encodingutf-8) file_handler.setFormatter(log_format) logger.addHandler(file_handler) # 【拓展】新增控制台处理器同时控制台文件双输出自动化刚需 console_handler logging.StreamHandler() console_handler.setFormatter(log_format) logger.addHandler(console_handler) if __name__ __main__: logger.debug(【DEBUG】调试新增用户接口入参{name:test}) logger.info(【INFO】新增用户接口执行成功) logger.error(【ERROR】新增用户数据库插入报错)输出样例2025-08-22 15:30:22 | DEBUG | __main__ | test.py:22 | 【DEBUG】调试新增用户接口入参{name:test} 2025-08-22 15:30:22 | INFO | __main__ | test.py:23 | 【INFO】新增用户接口执行成功四、logging 四大核心组件接口测试进阶重点组件类名作用自动化项目用途日志器Logger程序调用入口 (logger.info/error)每个模块独立实例各个接口用例文件导入使用隔离模块日志处理器Handler控制日志去向文件 / 控制台 / 网络FileHandler 存文件、StreamHandler 控制台打印格式器Formatter定义日志输出模板规范日志格式方便后续日志检索过滤器Filter自定义过滤规则按需过滤日志过滤敏感数据手机号、密码不落地日志核心逻辑Logger→绑定多个 Handler→每个 Handler 绑定 Formatter实现一套日志多渠道、多格式输出。五、接口自动化项目落地封装重点Pytest 专用日志工具类在自动化项目中单独新建common/log_utils.py封装全局日志全项目所有接口用例统一调用工业级规范# common/log_utils.py import logging import os from logging.handlers import RotatingFileHandler # 项目根目录生成logs文件夹 BASE_PATH os.path.dirname(os.path.dirname(__file__)) LOG_PATH os.path.join(BASE_PATH, logs) if not os.path.exists(LOG_PATH): os.mkdir(LOG_PATH) LOG_FILE os.path.join(LOG_PATH, autotest.log) def get_logger(nameautotest): 封装全局日志对象全项目统一调用 logger logging.getLogger(name) logger.setLevel(logging.DEBUG) # 避免重复添加handler多次导入模块重复打印bug if not logger.handlers: # 1.自定义格式 fmt %(asctime)s | %(levelname)-7s | %(name)s | %(filename)s:%(lineno)d | %(message)s formater logging.Formatter(fmtfmt, datefmt%Y-%m-%d %H:%M:%S) # 2.滚动文件处理器日志过大自动拆分防止单个log文件过大RotatingFileHandler # maxBytes单个文件50MBbackupCount保留3个备份日志 file_handle RotatingFileHandler(LOG_FILE, maxBytes50*1024*1024, backupCount3, encodingutf-8) file_handle.setFormatter(formater) #3.控制台处理器 console_handle logging.StreamHandler() console_handle.setFormatter(formater) #绑定处理器 logger.addHandler(file_handle) logger.addHandler(console_handle) return logger # 全局单例日志对象项目直接导入 logger get_logger()接口用例中使用示例test_api.py# 导入封装好的全局logger from common.log_utils import logger import requests def test_login_api(): url http://xxx/api/login payload {username:admin,password:123456} logger.info(f【登录接口】请求地址{url}请求参数{payload}) res requests.post(url,jsonpayload) logger.info(f【登录接口】接口返回{res.json()}) # 断言失败打印ERROR日志 try: assert res.json()[code] 0 except AssertionError as e: logger.error(f【登录接口断言失败】预期code0实际{res.json()[code]}) raise e六、自动化拓展日志对接 Allure 测试报告在 PytestAllure 项目中把 logging 日志嵌入测试报告用例详情页直接查看执行日志实现方式conftest.py 全局捕获日志# conftest.py import allure from common.log_utils import logger import logging pytest.fixture(autouseTrue) def attach_log_to_allure(): 自动将用例执行日志附加到Allure报告 class AllureHandler(logging.Handler): def emit(self, record): msg self.format(record) allure.attach(msg, name用例执行日志, attachment_typeallure.attachment_type.TEXT) # 临时绑定处理器 allure_handler AllureHandler() logger.addHandler(allure_handler) yield logger.removeHandler(allure_handler)运行 pytest 生成 allure 报告后打开报告→对应用例→附件即可查看当前用例完整日志。七、补充避坑知识点专栏实用踩坑总结重复打印日志多次导入 logger 重复 addHandler日志重复输出解决封装时判断if not logger.handlers再新增处理器中文乱码FileHandler 必须指定encodingutf-8日志文件无限变大不用原生 FileHandler改用RotatingFileHandler/TimedRotatingFileHandler实现日志拆分、过期清理上线环境优化正式环境修改日志级别为 INFO关闭 DEBUG 调试日志减少磁盘占用。八、总结logging 是 Python 接口自动化项目的日志基石从简易使用→自定义封装→项目落地→Allure 集成全链路覆盖所有自动化项目规范必须统一封装日志工具类摒弃零散 print 打印方便问题定位、用例复盘、报告可视化是接口测试工程师必备编码能力。