Fastapi + vue3 自动化测试平台(2)--日志中间件

FastAPI + Vue3 自动化测试平台(2)-- 日志中间件

前言

在开发和运行自动化测试平台时,日志功能是至关重要的一部分。日志不仅能帮助我们快速定位和解决问题,还能作为平台运行的记录依据,为后续分析和优化提供参考。

在本篇文章中,我们将介绍如何为 FastAPI 构建一个日志中间件,记录请求日志、错误日志和系统运行日志等关键信息,从而提升系统的可维护性和可观测性。


为什么需要日志中间件?

在一个完整的测试平台中,日志系统主要承担以下功能:

  1. 记录 API 请求日志:包括请求的时间、URL、方法、参数、响应时间等信息,便于排查问题。
  2. 捕获错误日志:记录后端的异常和错误,为开发者提供调试依据。
  3. 记录系统运行日志:包括任务执行、关键操作、资源使用情况等,为系统优化提供数据支持。
  4. 结构化日志输出:输出 JSON 格式的日志,便于后续存储和分析。

日志中间件的实现

1. 安装依赖

我们将使用 Python 的 loguru 库来实现日志功能。它简单易用,功能强大。

安装 loguru

bash 复制代码
pip install loguru

2.编写日志中间件代码

python 复制代码
"""日志中间件."""
import json
import os
import sys
from datetime import datetime, timedelta, timezone
from fastapi import Response
from loguru import logger
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.requests import Request


class Logger_Middleware(BaseHTTPMiddleware):
    """日志类."""

    async def dispatch(self, request: Request, call_next) -> Response:
        """重写dispatch方法.

        Args:
            request (Request): Request.
            call_next (_type_): 回调函数.

        Returns:
            Response: Response.
        """
        self.logger = logger
        method = request.method
        # body = await request.body()  # 请求体,预留坑位
        path = request.scope["path"]
        http_type = request.scope["type"]
        china_tz = timezone(timedelta(hours=8), "China")
        current_time_china = datetime.now(china_tz)
        formatted_time = current_time_china.strftime("%Y-%m-%d")
        response = await call_next(request)
        self.logger.remove()
        code = response.status_code
        INFO = f"{code}__{method}__{path}"
        # 判断请求的响应结果,然后写入log文件
        if code != 200:
            log_path = os.path.join("./log/error", f"{formatted_time}_error.log")
            self.logger.add(
                log_path,
                encoding='utf-8',
                rotation="7 days",
                enqueue=True
            )
            self.logger.error(INFO)
        else:
            log_path = os.path.join("./log/info", f"{formatted_time}_info.log")
            self.logger.add(
                log_path,
                encoding='utf-8',
                rotation="7 days",
                enqueue=True
            )
            self.logger.info(INFO)
        return response

3.注册到fastapi的服务中

python 复制代码
from fastapi import FastAPI
from middlewares.logging_middleware import LoggingMiddleware

# 初始化 FastAPI 应用
app = FastAPI()

# 添加日志中间件
app.middleware("http")(LoggingMiddleware())

4.日志输出示例

python 复制代码
2024-10-30 10:21:52.452 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
2024-10-30 10:23:43.225 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
2024-10-30 10:26:30.461 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
2024-10-30 10:30:21.039 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
2024-10-30 10:47:38.788 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
2024-10-30 10:47:51.864 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
2024-10-30 10:48:51.512 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
2024-10-30 10:49:47.051 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
2024-10-30 10:49:50.098 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
2024-10-30 10:53:17.336 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
2024-10-30 10:53:36.034 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
2024-10-30 10:54:30.589 | INFO     | middleware.log_middleware:dispatch:54 - 200__POST__/user/login
相关推荐
博客胡8 小时前
Python-fastAPI的学习与使用
学习·fastapi·ai编程
wang6021252188 小时前
FastAPI中的异步任务执行-celery
fastapi·celery
Wpa.wk14 小时前
自动化测试 - 文件上传 和 弹窗处理
开发语言·javascript·自动化测试·经验分享·爬虫·python·selenium
brave and determined16 小时前
CANN训练营 学习(day10)昇腾AI算子ST测试全攻略:从入门到精通
自动化测试·人工智能·log4j·算子·fuzz·测试实战·st测试
宁雨桥17 小时前
多引擎中英翻译API搭建与使用教程
python·fastapi·翻译
Luke Ewin17 小时前
基于FunASR开发的可私有化部署的语音转文字接口 | FunASR接口开发 | 语音识别接口私有化部署
人工智能·python·语音识别·fastapi·asr·funasr
音符犹如代码17 小时前
ZooKeeper 实战指南:从入门到场景解析
分布式·微服务·zookeeper·云原生·中间件·架构
百度测试开发1 天前
超细整理,性能测试如何做?怎么做?常见面试题(汇总五)
自动化测试·软件测试·软件测试工程师·接口测试·软件测试项目·软件测试面试·性能测试
钱彬 (Qian Bin)1 天前
项目实践11—全球证件智能识别系统(切换为PostgreSQL数据库)
人工智能·qt·fastapi
程序员杰哥2 天前
如何使用Postman做接口自动化测试?
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman