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.rhkb.cn/news/388447.html

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

相关文章

书生大模型实战营-基础关-书生大模型全链路开源体系

书生大模型全链路开源体系 书生浦语大模型开源历程书生浦语2.0(InternLM2)体系模型到应用书生浦语开源开放体系 书生浦语大模型开源历程 书生浦语2.0(InternLM2)体系 书生浦语2.0体系&#xff0c;模型大小主要有2种规格&#xff1a; 7B&#xff0c;为轻量级的研究和应用提供了…

【面试】前端开发中的“八股文”:助力还是阻力?

引言 在程序员面试中&#xff0c;“八股文”已经成为一个不可或缺的环节。它通常指的是那些面试中频繁出现的、有固定答案的问题&#xff0c;涉及计算机科学的基础知识、编程语言的特性、以及一些常见的设计模式和算法。然而&#xff0c;围绕“八股文”的争议从未停歇。一方面…

系统设计中15 个最重要的权衡

系统设计的第一法则&#xff1a;一切都与权衡有关。 在设计系统时&#xff0c;我们需要决定要包含哪些功能以及要忽略哪些功能。每次我们做这个决定时&#xff0c;我们都在进行权衡。在本文中&#xff0c;我们将探讨系统设计中遇到的15个最常见的权衡问题&#xff0c;并使用实…

程序员转行大模型:从代码到无限可能

在技术日新月异的时代背景下&#xff0c;许多程序员开始思考自己的职业发展路径。面对着人工智能与机器学习领域的迅速崛起&#xff0c;越来越多的技术人员将目光投向了更为广阔的天地——转行成为大模型研究者或开发者。这一转变不仅要求个人技能的迭代升级&#xff0c;更是一…

数据库一张以时间排好序的表中,找出多次相邻的那些行,如何实现??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

数据结构:线性表(上)

谈到线性的数据结构&#xff0c;那肯定离不开两个最基础的&#xff1a;数组和链表&#xff0c;当然有了数组和链表就会聊到栈和队列。 那么本篇我们就来介绍数组和链表 一、数组 数组&#xff08;Array&#xff09; 是一种很常见的数据结构。它由相同类型的元素&#xff08;…

分布式相关理论详解

目录 1.绪论 2.什么是分布式系统&#xff0c;和集群的区别 3.CAP理论 3.1 什么是CAP理论 3.2 一致性 3.2.1 计算机的一致性说明 1.事务中的一致性 2.并发场景下的一致性 3.分布式场景下的一致性 3.2.2 一致性分类 3.2.3 强一致性 1.线性一致性 a) 定义 a) Raft算法…

Java 并发编程:一文了解 Java 内存模型(处理器优化、指令重排序与内存屏障的深层解析)

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 022 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

14.按钮和多选框

<p>爱好&#xff1a;<input type"checkbox" value"Riding" name"hobby">骑行<input type"checkbox" value"experiment" name"hobby">做实验<input type"checkbox" value"lea…

彻底解决免费avif图片转换jpg

需求背景 最近在捣鼓一些图片,发现avif的图片,本地可以查看,但是上传到网站上提示不支持的格式。于是需要将avif图片转换为jpg的图片。网上好多都是收费的,这里说一下免费的教程。 操作教程 以下的操作教程为win11,win10也大同小异。 1、准备avif图片 # 下面这个网络图…

springboot惠农服务平台-计算机毕业设计源码50601

目录 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 惠农服务平台app 系统分析 2.1 可行性分析 2.2 系统功能分析 2.3 系统用例分析 2.4 系统流程分析 2.5本章小结 3 惠农服务平台app 总体设计 3.1 系统功能模块设计 3.2 数据库设计 表access_token (…

57_2设置Servlet模板、Servlet线程安全问题、跳转

设置Servlet模板 再创建类就有了 模板代码 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java")import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import j…

SAP 采购订单审批 Flexible Workflow

目录 1 简介 2 业务数据 1&#xff09;下采购订单&#xff0c;如果订单金额超过 15w 生成 Flexible Workflow 审批 2&#xff09;审批采购订单 - 系统默认主页显示需要审批的采购订单&#xff0c;也可以设置成发邮件提醒 3 后台配置 4 前台主数据定义 1&#xff09;创建…

c++ 智能指针shared_ptr与make_shared

shared_ptr是C11引入的一种智能指针&#xff0c;‌它允许多个shared_ptr实例共享同一个对象&#xff0c;‌通过引用计数来管理对象的生命周期。‌当最后一个持有对象的shared_ptr被销毁时&#xff0c;‌它会自动删除所指向的对象。‌这种智能指针主要用于解决资源管理问题&…

Qt遇到qt自身组件找不到

比如在使用qtcharts的时候&#xff0c;找不到 解决方法&#xff1a; 在cmakelist中添加 find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Charts REQUIRED) 是一个 CMake 命令&#xff0c;用于查找并配置 Qt 库中的特定组件。这条命令的作用是找到 Qt 的主要版本&#xff08;…

ElasticSearch搜索

ES搜索 elastic search 一套搜索引擎技术,主要技术栈包括 Elasticsearch&#xff1a;用于数据存储、计算和搜索 Kibana&#xff1a;用于数据可视化 在数据库模糊查询中,因为不走索引,所以效率很低,而在搜索引擎中,不仅效率高,而且即使出现个别错字,或者用拼音搜索,甚至用同…

路径规划 | Q-learning机器人路径规划算法(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 Q-learning机器人路径规划算法 机器人路径规划&#xff0c;机器人路径避障。求解常见的路径规划问题。内含算法的注释&#xff0c;模块化编程。 强化学习中的价值学习算法是一类重要的强化学习算法&#xff0c;它们通…

ntp服务重启报错Failed to restart ntpd.service: Unit is masked.

问题概述&#xff1a; 重启ntp服务报错Failed to restart ntpd.service: Unit is masked&#xff0c;使用systemctl unmask ntpd.service命令关闭屏蔽还是报错Failed to restart ntpd.service: Unit is masked 解决方法&#xff1a; 重装ntp服务 yum remove ntpyum install…

Go 1.19.4 结构体-Day 09

1. 结构体介绍 1.1 什么是结构体 结构体&#xff08;struct&#xff09;是一种用户定义的类型&#xff0c;它由一系列的字段组成&#xff0c;每个字段都有自己的名称和类型。 结构体也是值类型的&#xff0c;就算加了指针也是&#xff0c;只不过是复制的内存地址。 1.2 为什么…

2024年的AI人工智能风口是Python?一篇文章告诉你为什么!

Python是一种面向对象的、解释型的、通用的、开源的脚本编程语言&#xff0c;它之所以非常流行&#xff0c;我认为主要有三点原因&#xff1a; 1.Python 简单易用&#xff0c;学习成本低&#xff0c;看起来非常干净&#xff1b; 2.Python 标准库和第三库众多&#xff0c;功能…