142 lines
4.8 KiB
Python
142 lines
4.8 KiB
Python
"""错误处理和日志记录模块"""
|
|
import logging
|
|
import traceback
|
|
from typing import Optional, Any
|
|
from datetime import datetime
|
|
from functools import wraps
|
|
|
|
# 配置日志
|
|
logger = logging.getLogger("sqxp")
|
|
logger.setLevel(logging.INFO)
|
|
|
|
# 创建控制台处理器
|
|
console_handler = logging.StreamHandler()
|
|
console_handler.setLevel(logging.INFO)
|
|
|
|
# 创建格式化器
|
|
formatter = logging.Formatter(
|
|
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|
datefmt='%Y-%m-%d %H:%M:%S'
|
|
)
|
|
console_handler.setFormatter(formatter)
|
|
|
|
# 添加处理器
|
|
if not logger.handlers:
|
|
logger.addHandler(console_handler)
|
|
|
|
|
|
class BusinessException(Exception):
|
|
"""业务异常基类"""
|
|
def __init__(self, code: int = 400, message: str = "业务处理异常", data: Any = None):
|
|
self.code = code
|
|
self.message = message
|
|
self.data = data
|
|
super().__init__(message)
|
|
|
|
|
|
class ValidationException(BusinessException):
|
|
"""数据验证异常"""
|
|
def __init__(self, message: str = "数据验证失败", data: Any = None):
|
|
super().__init__(code=400, message=message, data=data)
|
|
|
|
|
|
class PermissionException(BusinessException):
|
|
"""权限不足异常"""
|
|
def __init__(self, message: str = "权限不足", data: Any = None):
|
|
super().__init__(code=403, message=message, data=data)
|
|
|
|
|
|
class ResourceNotFoundException(BusinessException):
|
|
"""资源不存在异常"""
|
|
def __init__(self, resource: str = "资源", data: Any = None):
|
|
super().__init__(code=404, message=f"{resource}不存在", data=data)
|
|
|
|
|
|
class ResourceConflictException(BusinessException):
|
|
"""资源冲突异常(如重复创建)"""
|
|
def __init__(self, message: str = "资源已存在", data: Any = None):
|
|
super().__init__(code=409, message=message, data=data)
|
|
|
|
|
|
class OrderLockedException(BusinessException):
|
|
"""订单已锁定异常"""
|
|
def __init__(self, message: str = "订单已被锁定", data: Any = None):
|
|
super().__init__(code=423, message=message, data=data)
|
|
|
|
|
|
class InvalidStatusTransitionException(BusinessException):
|
|
"""无效状态转换异常"""
|
|
def __init__(self, message: str = "无效的状态转换", data: Any = None):
|
|
super().__init__(code=400, message=message, data=data)
|
|
|
|
|
|
def log_operation(module: str, operation: str):
|
|
"""操作日志装饰器"""
|
|
def decorator(func):
|
|
@wraps(func)
|
|
def wrapper(*args, **kwargs):
|
|
start_time = datetime.now()
|
|
user_id = kwargs.get('current_user', {}).get('user_id') if kwargs.get('current_user') else 'anonymous'
|
|
|
|
logger.info(f"[{module}] 用户 {user_id} 开始执行 {operation}")
|
|
|
|
try:
|
|
result = func(*args, **kwargs)
|
|
elapsed = (datetime.now() - start_time).total_seconds()
|
|
logger.info(f"[{module}] 用户 {user_id} 执行 {operation} 成功,耗时 {elapsed:.2f}s")
|
|
return result
|
|
except BusinessException as e:
|
|
elapsed = (datetime.now() - start_time).total_seconds()
|
|
logger.warning(f"[{module}] 用户 {user_id} 执行 {operation} 业务异常: {e.message},耗时 {elapsed:.2f}s")
|
|
raise
|
|
except Exception as e:
|
|
elapsed = (datetime.now() - start_time).total_seconds()
|
|
logger.error(f"[{module}] 用户 {user_id} 执行 {operation} 系统异常: {str(e)},耗时 {elapsed:.2f}s")
|
|
logger.error(f"[{module}] 异常详情: {traceback.format_exc()}")
|
|
raise
|
|
|
|
return wrapper
|
|
return decorator
|
|
|
|
|
|
def log_api_request(endpoint: str):
|
|
"""API请求日志装饰器"""
|
|
def decorator(func):
|
|
@wraps(func)
|
|
async def wrapper(*args, **kwargs):
|
|
start_time = datetime.now()
|
|
logger.info(f"[API] 请求开始: {endpoint}")
|
|
|
|
try:
|
|
result = await func(*args, **kwargs)
|
|
elapsed = (datetime.now() - start_time).total_seconds()
|
|
logger.info(f"[API] 请求完成: {endpoint},耗时 {elapsed:.3f}s")
|
|
return result
|
|
except Exception as e:
|
|
elapsed = (datetime.now() - start_time).total_seconds()
|
|
logger.error(f"[API] 请求异常: {endpoint},耗时 {elapsed:.3f}s,错误: {str(e)}")
|
|
raise
|
|
|
|
return wrapper
|
|
return decorator
|
|
|
|
|
|
def log_order_operation(operation: str):
|
|
"""订单操作日志装饰器"""
|
|
return log_operation("订单管理", operation)
|
|
|
|
|
|
def log_delivery_operation(operation: str):
|
|
"""配送操作日志装饰器"""
|
|
return log_operation("配送管理", operation)
|
|
|
|
|
|
def log_settlement_operation(operation: str):
|
|
"""结算操作日志装饰器"""
|
|
return log_operation("结算管理", operation)
|
|
|
|
|
|
def log_user_operation(operation: str):
|
|
"""用户操作日志装饰器"""
|
|
return log_operation("用户管理", operation)
|