Files
2026-05-12 16:35:07 +08:00

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)