引言
日志是软件开发中的关键组成部分,为开发和测试人员提供了调试和监控应用程序的重要手段。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 报告结合,以提升自动化测试项目的日志管理和报告生成能力。
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。