| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- """错误处理和日志记录模块"""
- 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)
|