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
性能监控实现
性能监控关键点
性能监控主要关注图片上传、处理和响应三个阶段的耗时。通过在关键代码段添加时间记录,可以准确分析每个阶段的性能瓶颈。我们将在以下位置添加性能监控代码:
- 文件上传完成后
- 图片处理开始前
- 图片处理完成后
- 响应发送前
代码实现
修改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