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())