loguru日志模块:简化Python自动化测试的日志管理!

引言

日志是软件开发中的关键组成部分,为开发和测试人员提供了调试和监控应用程序的重要手段。loguru 是一个第三方的 Python 日志库,以其简洁的 API 和自动化的功能脱颖而出。本文将探讨为什么项目中需要日志,loguru 为何受到青睐,以及如何封装和在接口自动化测试项目中使用 loguru,同时结合 Allure 生成丰富的测试报告。

项目中需要日志的原因

  • 问题诊断:记录程序运行时的状态,便于问题诊断。

  • 监控和审计:监控应用程序的行为,进行安全审计。

  • 性能分析:记录性能指标,帮助分析和优化性能瓶颈。

loguru 的优势

  • 简洁的 API:loguru 提供了简洁直观的 API,简化了日志记录。

  • 自动化功能:自动处理日志文件的轮转和格式。

  • 高性能:相比标准的 logging 库,loguru 在性能上进行了优化。

  • 易于集成:快速集成到现有项目中,与测试框架协同工作。

loguru 的封装最佳实践

以下是一个 loguru 封装的示例,展示如何创建一个日志记录器并配置其行为:

from loguru import logger
import os# 创建日志目录
log_dir = "logs"
os.makedirs(log_dir, exist_ok=True)# 配置logger
logger.add(f"{log_dir}/app.log",rotation="1 week",  # 日志轮转周期compression="zip",   # 轮转文件压缩level="DEBUG",      # 最低日志级别format="{time:YYYY-MM-DD at HH:mm:ss} - {level} - {message}",
)class CustomLogger:def log_info(self, message):logger.info(message)def log_error(self, message):logger.error(message)# 使用封装的logger
logger = CustomLogger()
logger.log_info("This is an informational message.")

下面是关于 loguru 的一些高级用法,结合项目需要可使用:

自定义日志格式

loguru 允许你通过 format 参数在 logger.add()方法中定义日志的输出格式。你可以使用字符串格式化来包含日志的时间、级别、消息等。

基本示例:

from loguru import logger# 定义日志格式
log_format = "{time:YYYY-MM-DD at HH:mm:ss} - {level} - {message}"
logger.add("logs/my_app.log", format=log_format)logger.info("This is an informational message.")

高级格式化:

from loguru import logger
import platform# 定义更复杂的日志格式,包括额外的字段
log_format = ("<level>{level: <8}</level> ""<cyan>{time:YYYY-MM-DD HH:mm:ss.SSS}</cyan> ""<level>{message}</level> ""<green>{function}</green> ""<cyan>{file}:{line}</cyan>"
)logger.add("logs/my_app.log", format=log_format, level="DEBUG")logger.debug(f"This is a debug message from {platform.system()}.")

结构化日志输出

结构化日志是一种将日志数据输出为结构化格式(如 JSON)的方式,这使得日志更易于被机器解析和处理。

启用结构化日志:

from loguru import logger# 定义日志格式为JSON
logger.add("logs/my_app.json", format="{time} {level} {message}", serialize=True)logger.info("This is a structured log message.")

自定义结构化日志格式:

from loguru import logger# 定义一个自定义的日志记录器
def custom_format(record):return {"timestamp": record["time"],"level": record["level"].name,"message": record["message"],"extra": record["extra"],}logger.add("logs/my_app_custom.json", format=custom_format, serialize=True)logger.info("This is a custom structured log message.", extra={"user_id": 42})

处理日志中的异常

loguru 可以自动处理日志中的异常,并将异常信息以结构化格式输出。

捕获异常:

from loguru import loggerlogger.add("logs/my_app.log", backtrace=True, diagnose=True)try:1 / 0
except Exception as e:logger.error("An error occurred", exc_info=True)

多文件和多处理器日志

loguru 还支持将日志输出到多个文件,并且是多处理器安全的。

多文件日志:

from loguru import loggerlogger.add("logs/debug.log", level="DEBUG", format="{time} {level} {message}", rotation="1 week")
logger.add("logs/info.log", level="INFO", format="{time} {level} {message}", rotation="1 month")logger.debug("This is a debug message.")
logger.info("This is an info message.")

多处理器日志:

from loguru import loggerlogger.add("logs/my_app.log", enqueue=True)logger.info("This is a log message from a multi-processor environment.")

通过这些方法,你可以灵活地定制 loguru 的日志输出格式和结构,使其满足你的项目需求。

基本旋转策略

loguru 使用 rotation 参数来设置日志旋转的策略。你可以指定日志文件的最大大小或旋转的时间间隔。

from loguru import logger# 设置日志文件的最大大小为10MB
logger.add("logs/my_app.log", rotation="10 MB")# 设置日志文件每天旋转一次
logger.add("logs/my_app.log", rotation="1 day")

高级旋转策略

你可以结合使用大小和时间来设置更复杂的旋转策略。

from loguru import logger# 设置日志文件每5天或达到100MB时旋转一次
logger.add("logs/my_app.log", rotation="5 days 100 MB")

保留策略

使用 retention 参数,你可以设置旧日志文件的最长保留时间。这可以是具体的时间长度,如"1 week"、"2 months",或者是一个函数,该函数返回一个 datetime.timedelta 对象。

from loguru import logger
from datetime import timedelta# 设置旧日志文件保留7天
logger.add("logs/my_app.log", retention="7 days")# 使用函数设置保留策略
def retention_policy():return timedelta(days=7)logger.add("logs/my_app.log", retention=retention_policy)

压缩策略

loguru 还允许你设置日志文件在旋转后是否需要压缩,以及使用哪种压缩格式。这通过 compression 参数设置。

from loguru import logger# 设置日志文件在旋转后使用gzip压缩
logger.add("logs/my_app.log", compression="gz")

综合示例

from loguru import logger# 综合使用日志旋转、保留和压缩策略
logger.add("logs/my_app.log",rotation="1 week 100 MB",  # 每周或文件达到100MB时旋转retention="30 days",        # 保留30天的日志compression="tar.gz"       # 使用tar.gz格式压缩旧日志文件
)logger.info("This is a log message with rotation, retention, and compression.")

通过这些设置,你可以确保日志文件不会无限增长,同时旧的日志文件可以被适当地保留和压缩,从而节省存储空间并便于日志管理。

在接口自动化测试项目中调用封装好的 loguru

在自动化测试项目中,可以在测试用例执行前后调用 loguru 记录日志:

def test_api_endpoint():try:logger.log_info("Testing API endpoint.")# API调用逻辑response = requests.get("http://api.example.com/data")assert response.status_code == 200logger.log_info("API response received successfully.")except AssertionError as e:logger.log_error(f"Test failed with status code: {response.status_code}")except Exception as e:logger.log_error(f"An unexpected error occurred: {e}")

测试用例执行失败或执行异常时结合 loguru 和 Allure

当测试用例执行失败或出现异常时,可以将 loguru 记录的日志与 Allure 报告结合,提供更丰富的测试结果信息:

from allure import allure_report@allure_report(test_case_name="API Endpoint Test")
def test_api_with_allure():try:logger.log_info("Starting API test case.")# 测试逻辑response = requests.get("http://api.example.com/data")assert response.status_code == 200except AssertionError as e:allure.attach.body(str(response.content), name="Response Content", type="text")logger.log_error(f"Allure attached response content on failure.")raise eexcept Exception as e:allure.attach.body(str(e), name="Error Details", type="text")logger.log_error(f"Allure attached error details on exception.")raise efinally:logger.log_info("API test case completed.")

结论

loguru 以其简洁的 API 和自动化功能简化了日志记录过程,与 Allure 结合使用,可以为自动化测试提供详细的问题诊断信息和丰富的报告内容,提高测试的可追踪性和可维护性。鼓励开发者和测试工程师采用 loguru 进行日志记录,并与 Allure 报告结合,以提升自动化测试项目的日志管理和报告生成能力。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python机器学习】决策树的构造——递归构建决策树

我们可以采用递归的原则处理数据集&#xff0c;递归结束的条件是&#xff1a;程序遍历完所有划分数据集的属性&#xff0c;或者每个分支下的所有实例都具有相同的分类。如果所有实例具有相同的分类&#xff0c;则得到一个叶子节点或者终止块。任何到达叶子节点的数据必然属于叶…

年化27.9%,最大回撤-13.6%的可转债因子策略,结合机器学习特征筛选(附python代码)

原创文章第603篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 我们重新更新了可转债的全量数据&#xff0c;包含全量已经退市的转债。 ——这是与股票市场不一样的地方&#xff0c;股票退市相对少&#xff0c;而转债本身就有退出周期。 因此&…

x264 环路滤波原理系列:x264_frame_deblock_row 函数

x264_frame_deblock_row 函数 功能:该函数对视频帧中的一行宏块(Macroblock)进行去块滤波处理。去块滤波是视频编码中常用的一种技术,用于减少宏块之间的边界不连续性,从而提高视频质量。 函数关系与原理图: 函数原理流程梳理: 局部变量初始化;for 循环处理每个宏块:…

如何借助低代码 + BI 实现国央企数智化转型?

概要 在当前的软件开发时代&#xff0c;许多企业面临着核心技术缺失、专业人才短缺以及产品能力单一等问题&#xff0c;迫切需要加强技术实力&#xff0c;补充和扩展原有的业务和行业能力。将技术与业务需求深度结合&#xff0c;构建适应时代需求的技术业务模式&#xff0c;成…

容易发表的医学SCI期刊推荐,附投稿经验

常笑医学整理了适合医学生、医务工作者进行论文投稿的医学SCI期刊&#xff0c;附期刊详细参数与真实投稿经验&#xff0c;供大家参考。 1、ULTRASOUND IN MEDICINE AND BIOLOGY&#xff08;超声医学和生物学&#xff09; &#xff08;详细投稿信息请点击刊物名称查看&#xff…

MATLAB被360误杀的解决方案

前面被误杀&#xff0c;今天又被误杀。 前面误杀结果是缺少文件&#xff0c;重装MATLAB也不行。 结果重装了操作系统。 这次&#xff0c;看到了提示额外小心。 当时备份了“病毒”文件&#xff0c;结果备份的也被杀了。 解铃还须系铃人 在360安全卫士里面恢复&#xff0c;步骤…

数据库管理-第225期 Oracle DB 23.5新特性一览(20240730)

数据库管理225期 2024-07-30 数据库管理-第225期 Oracle DB 23.5新特性一览&#xff08;20240730&#xff09;1 二进制向量维度格式2 RAC上的复制HNSW向量索引3 JSON集合4 JSON_ID SQL函数5 优化的通过网络对NVMe设备的Oracle的原生访问6 DBCA支持PMEM存储7 DBCA支持标准版高可…

PPT图表制作

一、表格的底纹 插入→表格→绘制表格→表设计→选择单元格→底纹 二、把一张图片做成九宫格 1. 把一张图片画成九宫格&#xff08;处理过后还是一张图片&#xff0c;但是有框线&#xff09; 绘制33表格→插入图片→全选表格单元格→右键设置形状格式→填充→图片或纹理填充…

前后端分离开发遵循接口规范-YAPI

目前&#xff0c;网站主流开发方式是前后端分离。因此前后端必须遵循一套统一的规范&#xff0c;才能保证前后端进行正常的数据&#xff08;JSON数据格式&#xff09;请求、影响&#xff0c;这套规范即是 YAPI. 产品经理撰写原型&#xff1b; 前端或后端撰写接口文档。 YAPI…

一座山城如何打造教育“一张网”

教育新基建作为国家新基建的重要组成部分,是实现教育高质量发展的基础支撑。2021年,教育部等六部门印发相关部署意见时明确提出:到2025年,基本形成结构优化、集约高效、安全可靠的教育新型基础设施体系。 在此宏观导向下,山城重庆积极响应,立足本地情况,开启了其特色化的探索之…

K8s对接Ceph-csi配置手册(附带踩坑记录以及解决方法)

目录 Ceph CSI (Container Storage Interface) CSI 的作用&#xff1a; 前提配置 版本信息 获取Ceph认证信息 获取Ceph集群Monitor信息 下载并部署Ceph CSI 如果此时全部显示错误&#xff0c;那就代表镜像拉取错误&#xff0c;此时执行的yaml脚本&#xff0c;通过yaml脚…

进行良好的文献综述能否提高学术研究的可信度

VersaBot一键生成文献综述 进行良好的文献综述 对于从多个方面提高学术研究的可信度至关重要&#xff1b; 1. 展示专业知识&#xff1a; 全面的回顾表明您对您所在领域的现有知识和相关理论有深入的了解。这将使您成为权威&#xff0c;并将您的研究置于更广泛的背景下。 2.…

ValueError: invalid literal for int() with base 10: ‘a‘

ValueError: invalid literal for int() with base 10: ‘a‘ 目录 ValueError: invalid literal for int() with base 10: ‘a‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff…

【CodinGame】趣味算法(教学用) CLASH OF CODE -20240730

文章目录 正文转换单位观察模式数字处理字符串处理 写在最后END 正文 转换单位 import sys import math# Auto-generated code below aims at helping you parse # the standard input according to the problem statement.n int(input()) for i in range(n):e int(input())…

win10 定时任务实战--开机启动 Java 应用

引言 在Windows 10系统中&#xff0c;可以通过结合任务计划程序&#xff08;Task Scheduler&#xff09;和批处理脚本&#xff08;.bat&#xff09;或PowerShell脚本来定期运行Java程序。以下是一个基本的步骤说明&#xff0c;展示如何设置这一过程。 第一步&#xff1a;准备…

爬虫“拥抱大模型”,有没有搞头?

验证码坐标识别 数据采集过程中&#xff0c;可能会碰到各种风控策略。其中&#xff0c;验证码人机验证是较为常见的&#xff0c;点选类验证码需要识别出相应的坐标&#xff0c;碰到这种情况&#xff0c;一般要么自己训练模型&#xff0c;要么对接打码平台。现在也可以将识别工…

多媒体技术:语音音频压缩

语音音频压缩 语音音频基础知识物理世界的声音——语音 语音音频编码方法波形编码波形编码原理常用波形编码技术脉冲编码调制PCM差分脉冲编码调制DPCM自适应差分脉冲编码调制ADPCM子带ADPCM 参数编码感知编码 语音音频编码框架语音编码框架音频编码框架混合编码框架 语音音频编…

JDK8的新特性

目录 接口的默认方法和静态方法 Lambda表达式1、匿名内部类2、函数式接口(FunctionalInterface)2.1 无参函数式接口匿名内部类方式-->Lambda表达式方式 2.2 有参函数式接口匿名内部类方式-->Lambda表达式方式 3、Lambda实战 3.1 循环遍历 3.2 集合排序 3.3 创建线程方…

黑马头条Day12-项目部署_持续集成

一、今日内容介绍 1. 什么是持续集成 持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff09;&#xff0c;指的是频繁地&#xff08;一天多次&#xff09;将代码集成到主干。 持续集成的组成要素&#xff1a; 一个自动构建过程&#xff0c;从检出代码、…

Golang处理Word文档模板实现标签填充|表格插入|图标绘制和插入

本教程主要实现【Golang处理Word文档模板实现标签填充|表格插入|图标绘制和插入】。 本文源码&#xff1a;https://gitee.com/songfayuan/go-zero-demo 教程源码分支&#xff1a;master 分支&#xff08;_examples/word-template/fill-word-template.go&#xff09; Golang处理…