GitHub_Trending/re/rembg-webapp-tutorial后端中间件:请求日志与性能监控实现

GitHub_Trending/re/rembg-webapp-tutorial后端中间件:请求日志与性能监控实现

GitHub_Trending/re/rembg-webapp-tutorial后端中间件:请求日志与性能监控实现

【免费下载链接】rembg-webapp-tutorial 项目地址: https://gitcode.***/GitHub_Trending/re/rembg-webapp-tutorial

你是否在使用rmbg-webapp-tutorial项目时,遇到过请求处理缓慢却找不到原因的情况?是否想知道用户上传了哪些图片、处理耗时多久?本文将为你详细介绍如何为该项目添加请求日志与性能监控功能,让你轻松掌握应用运行状态,快速定位和解决问题。读完本文,你将能够:实现完整的请求日志记录、添加性能耗时监控、将日志信息格式化输出,以及在现有项目架构中无缝集成这些功能。

项目概述

rmbg-webapp-tutorial是一个基于Flask框架的Web应用,主要功能是提供图片背景去除服务。用户可以通过网页上传图片,应用后端使用rembg库处理图片并返回去除背景后的结果。项目的核心文件包括:

  • app.py:Flask应用主程序,包含路由处理和图片处理逻辑
  • basic.py:图片处理基础示例代码
  • requirements.txt:项目依赖列表
  • templates/index.html:前端上传页面

请求日志功能实现

日志功能设计思路

请求日志功能将记录每次图片上传请求的关键信息,包括:请求时间、客户端IP、上传文件名、文件大小、处理耗时和请求结果。我们将使用Python标准库中的logging模块来实现日志功能,并通过Flask的装饰器机制在路由处理函数前后添加日志记录代码。

代码实现

首先,在app.py中导入logging模块和时间模块,然后配置日志格式和级别:

import logging
import time
from flask import Flask, render_template, request, send_file
from rembg import remove
from PIL import Image
from io import BytesIO

app = Flask(__name__)

# 配置日志
logging.basi***onfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('app.log'),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

然后,创建一个装饰器函数来记录请求日志和处理时间:

def log_request(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        # 记录请求信息
        client_ip = request.remote_addr
        if request.method == 'POST' and 'file' in request.files:
            file = request.files['file']
            filename = file.filename
            file_size = len(file.read())
            file.seek(0)  # 重置文件指针,以便后续处理
        else:
            filename = 'N/A'
            file_size = 0
        
        logger.info(f"Received request from {client_ip}, file: {filename}, size: {file_size} bytes")
        
        # 执行原函数
        response = func(*args, **kwargs)
        
        # 记录响应信息和耗时
        end_time = time.time()
        elapsed_time = (end_time - start_time) * 1000  # 转换为毫秒
        logger.info(f"Request processed, status code: {response.status_code}, elapsed time: {elapsed_time:.2f}ms")
        
        return response
    return wrapper

最后,将装饰器应用到上传文件处理路由上:

@app.route('/', methods=['GET', 'POST'])
@log_request
def upload_file():
    # 原有的路由处理代码...
    pass

性能监控实现

性能监控关键点

性能监控主要关注图片上传、处理和响应三个阶段的耗时。通过在关键代码段添加时间记录,可以准确分析每个阶段的性能瓶颈。我们将在以下位置添加性能监控代码:

  1. 文件上传完成后
  2. 图片处理开始前
  3. 图片处理完成后
  4. 响应发送前

代码实现

修改app.py中的upload_file函数,添加性能监控代码:

@app.route('/', methods=['GET', 'POST'])
@log_request
def upload_file():
    if request.method == 'POST':
        if 'file' not in request.files:
            return 'No file uploaded', 400
        file = request.files['file']
        if file.filename == '':
            return 'No file selected', 400
        if file:
            # 记录文件读取开始时间
            read_start = time.time()
            input_image = Image.open(file.stream)
            read_end = time.time()
            logger.info(f"File read time: {(read_end - read_start) * 1000:.2f}ms")
            
            # 记录图片处理开始时间
            process_start = time.time()
            output_image = remove(input_image, post_process_mask=True)
            process_end = time.time()
            logger.info(f"Image processing time: {(process_end - process_start) * 1000:.2f}ms")
            
            # 记录响应准备开始时间
            response_start = time.time()
            img_io = BytesIO()
            output_image.save(img_io, 'PNG')
            img_io.seek(0)
            response_end = time.time()
            logger.info(f"Response preparation time: {(response_end - response_start) * 1000:.2f}ms")
            
            return send_file(img_io, mimetype='image/png', as_attachment=True, download_name='_rmbg.png')
    return render_template('index.html')

日志与监控集成

集成效果展示

完成上述代码修改后,当用户上传图片时,应用将在控制台和日志文件中输出类似以下的日志信息:

2025-10-16 10:00:00,123 - __main__ - INFO - Received request from 192.168.1.100, file: test.jpg, size: 102400 bytes
2025-10-16 10:00:00,150 - __main__ - INFO - File read time: 27.34ms
2025-10-16 10:00:02,321 - __main__ - INFO - Image processing time: 2171.56ms
2025-10-16 10:00:02,350 - __main__ - INFO - Response preparation time: 29.12ms
2025-10-16 10:00:02,351 - __main__ - INFO - Request processed, status code: 200, elapsed time: 2350.25ms

日志文件分析

日志文件app.log将保存在项目根目录下,包含所有请求的详细信息。通过分析日志文件,你可以:

  • 统计单位时间内的请求数量
  • 找出处理耗时最长的请求
  • 识别频繁上传的文件类型
  • 发现异常状态码出现的规律

前端状态展示

为了让用户了解当前请求的处理状态,我们可以在前端页面添加一个简单的加载指示器。修改templates/index.html文件,添加以下代码:

在标签中添加样式:

.loading {
  display: none;
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-size: 24px;
  color: #333;
}

在标签中添加加载指示器元素:

<div class="loading">Processing image...</div>

修改JavaScript代码,在文件上传和表单提交时显示/隐藏加载指示器:

fileInput.addEventListener("change", function () {
  if (fileInput.files.length > 0) {
    document.querySelector('.loading').style.display = 'block';
    uploadForm.submit();
  }
});

// 在drop事件处理函数中添加
dropZone.addEventListener("drop", function (e) {
  // ... 原有代码 ...
  document.querySelector('.loading').style.display = 'block';
  uploadForm.submit();
});

总结与展望

通过本文介绍的方法,我们成功为rmbg-webapp-tutorial项目添加了请求日志和性能监控功能。这些功能可以帮助开发者更好地了解应用运行状态,快速定位问题。未来,我们可以进一步扩展这些功能,例如:

  • 将日志信息存储到数据库中,以便进行长期分析
  • 添加实时监控仪表盘,可视化展示关键性能指标
  • 设置性能阈值告警,当处理时间超过阈值时发送通知
  • 实现请求追踪功能,关联多个相关请求

希望本文对你理解和改进rmbg-webapp-tutorial项目有所帮助。如果你有任何问题或建议,欢迎在项目的README.md中留言反馈。别忘了点赞、收藏本文,关注项目更新,下期我们将介绍如何为应用添加用户认证功能。

【免费下载链接】rembg-webapp-tutorial 项目地址: https://gitcode.***/GitHub_Trending/re/rembg-webapp-tutorial

转载请说明出处内容投诉
CSS教程网 » GitHub_Trending/re/rembg-webapp-tutorial后端中间件:请求日志与性能监控实现

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买