53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
from typing import Dict, Any
|
||
from app.models.database import SessionLocal
|
||
from app.models.request_log import RequestLogDB
|
||
import json
|
||
from threading import Thread
|
||
import logging
|
||
import traceback
|
||
|
||
|
||
def save_request_log(log_data: Dict[str, Any]):
|
||
"""保存请求日志到数据库"""
|
||
db = None
|
||
try:
|
||
db = SessionLocal()
|
||
|
||
# 确保headers和body可以序列化为JSON
|
||
if 'headers' in log_data and log_data['headers']:
|
||
try:
|
||
# 尝试将headers转换为JSON字符串再解析回来,确保可序列化
|
||
json.dumps(log_data['headers'])
|
||
except (TypeError, OverflowError):
|
||
# 如果无法序列化,则转换为字符串
|
||
log_data['headers'] = str(log_data['headers'])
|
||
|
||
if 'body' in log_data and log_data['body']:
|
||
try:
|
||
# 尝试将body转换为JSON字符串再解析回来,确保可序列化
|
||
json.dumps(log_data['body'])
|
||
except (TypeError, OverflowError):
|
||
# 如果无法序列化,则转换为字符串
|
||
log_data['body'] = str(log_data['body'])
|
||
|
||
# 创建日志记录
|
||
log = RequestLogDB(**log_data)
|
||
db.add(log)
|
||
db.commit()
|
||
print(f"请求日志已保存: {log_data['path']}")
|
||
except Exception as e:
|
||
print(f"保存日志失败: {str(e)}")
|
||
print(traceback.format_exc())
|
||
if db:
|
||
db.rollback()
|
||
finally:
|
||
if db:
|
||
db.close()
|
||
|
||
def log_request_async(log_data: Dict[str, Any]):
|
||
"""在新线程中异步处理日志"""
|
||
try:
|
||
Thread(target=save_request_log, args=(log_data,), daemon=True).start()
|
||
except Exception as e:
|
||
print(f"启动日志线程失败: {str(e)}")
|
||
print(traceback.format_exc()) |