deliveryman-api/app/core/logger.py
2025-03-16 00:06:45 +08:00

53 lines
1.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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