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 logger

logger.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 logger

logger.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 logger

logger.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 == 200
        logger.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 == 200
    except 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 e
    except Exception as e:
        allure.attach.body(str(e), name="Error Details", type="text")
        logger.log_error(f"Allure attached error details on exception.")
        raise e
    finally:
        logger.log_info("API test case completed.")

结论

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

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

软件测试面试文档

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

相关推荐
大模型铲屎官43 分钟前
【Python-Day 14】玩转Python字典(上篇):从零开始学习创建、访问与操作
开发语言·人工智能·pytorch·python·深度学习·大模型·字典
yunvwugua__1 小时前
Python训练营打卡 Day27
开发语言·python
Stara05112 小时前
基于多头自注意力机制(MHSA)增强的YOLOv11主干网络—面向高精度目标检测的结构创新与性能优化
人工智能·python·深度学习·神经网络·目标检测·计算机视觉·yolov11
那雨倾城3 小时前
使用 OpenCV 将图像中标记特定颜色区域
人工智能·python·opencv·计算机视觉·视觉检测
LuckyTHP5 小时前
java 使用zxing生成条形码(可自定义文字位置、边框样式)
java·开发语言·python
mahuifa7 小时前
(7)python开发经验
python·qt·pyside6·开发经验
学地理的小胖砸8 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
安迪小宝8 小时前
6 任务路由与负载均衡
运维·python·celery
Blossom.1188 小时前
使用Python实现简单的人工智能聊天机器人
开发语言·人工智能·python·低代码·数据挖掘·机器人·云计算
lisw058 小时前
Python高级进阶:Vim与Vi使用指南
python·vim·excel