diff --git a/plugins/stats_collector/decorators.py b/plugins/stats_collector/decorators.py index 842461b..83333d2 100644 --- a/plugins/stats_collector/decorators.py +++ b/plugins/stats_collector/decorators.py @@ -1,6 +1,7 @@ import functools import time import traceback +import logging from datetime import datetime from typing import Callable, Dict, Any, Tuple @@ -17,72 +18,99 @@ def plugin_stats_decorator(plugin_name: str) -> Callable: Returns: 装饰器函数 """ + # 获取日志记录器 + logger = logging.getLogger(f"StatsCollector.{plugin_name}") + logger.info(f"为插件 '{plugin_name}' 应用统计装饰器") + def decorator(func: Callable) -> Callable: + logger.info(f"装饰 '{plugin_name}' 的 {func.__name__} 方法") + @functools.wraps(func) def wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: # 获取数据库连接 - db_manager = DBConnectionManager.get_instance() - stats_db = StatsDBOperator(db_manager) - - # 提取消息信息 - content = message.get("content", "") - sender = message.get("sender", "") - roomid = message.get("roomid", "") - - # 记录开始时间 - start_time = time.time() - try: - # 调用原始方法 - success, response = func(self, message) + logger.debug(f"[{plugin_name}] 开始处理消息") + db_manager = DBConnectionManager.get_instance() + stats_db = StatsDBOperator(db_manager) - # 计算执行时间(毫秒) - process_time_ms = (time.time() - start_time) * 1000 + # 提取消息信息 + content = message.get("content", "") + sender = message.get("sender", "") + roomid = message.get("roomid", "") - # 记录插件调用 - stats_db.record_plugin_call( - plugin_name=plugin_name, - command=content, - user_id=sender, - group_id=roomid, - success=success, - process_time_ms=process_time_ms - ) + logger.debug(f"[{plugin_name}] 消息内容: '{content}', 发送者: {sender}, 群ID: {roomid}") - return success, response - except Exception as e: - # 计算执行时间(毫秒) - process_time_ms = (time.time() - start_time) * 1000 - - # 记录错误 - error_message = str(e) - stack_trace = traceback.format_exc() + # 记录开始时间 + start_time = time.time() + logger.debug(f"[{plugin_name}] 开始执行时间: {datetime.fromtimestamp(start_time).strftime('%Y-%m-%d %H:%M:%S.%f')}") try: - # 记录插件调用(失败) + # 调用原始方法 + logger.debug(f"[{plugin_name}] 调用原始方法 {func.__name__}") + success, response = func(self, message) + + # 计算执行时间(毫秒) + end_time = time.time() + process_time_ms = (end_time - start_time) * 1000 + logger.debug(f"[{plugin_name}] 执行完成,耗时: {process_time_ms:.2f}ms, 结果: {success}, 响应: {response}") + + # 记录插件调用 + logger.debug(f"[{plugin_name}] 记录插件调用统计") stats_db.record_plugin_call( plugin_name=plugin_name, command=content, user_id=sender, group_id=roomid, - success=False, + success=success, process_time_ms=process_time_ms ) + logger.info(f"[{plugin_name}] 成功记录插件调用: {content}, 耗时: {process_time_ms:.2f}ms") - # 记录错误详情 - stats_db.record_error( - plugin_name=plugin_name, - command=content, - user_id=sender, - group_id=roomid, - error_message=error_message, - stack_trace=stack_trace - ) - except Exception as db_error: - print(f"记录插件统计数据失败: {db_error}") - - # 重新抛出异常,让上层处理 - raise + return success, response + except Exception as e: + # 计算执行时间(毫秒) + end_time = time.time() + process_time_ms = (end_time - start_time) * 1000 + + # 记录错误 + error_message = str(e) + stack_trace = traceback.format_exc() + logger.error(f"[{plugin_name}] 执行出错: {error_message}") + logger.debug(f"[{plugin_name}] 错误堆栈: {stack_trace}") + + try: + # 记录插件调用(失败) + logger.debug(f"[{plugin_name}] 记录插件调用失败统计") + stats_db.record_plugin_call( + plugin_name=plugin_name, + command=content, + user_id=sender, + group_id=roomid, + success=False, + process_time_ms=process_time_ms + ) + + # 记录错误详情 + logger.debug(f"[{plugin_name}] 记录错误详情") + stats_db.record_error( + plugin_name=plugin_name, + command=content, + user_id=sender, + group_id=roomid, + error_message=error_message, + stack_trace=stack_trace + ) + logger.info(f"[{plugin_name}] 成功记录插件错误: {content}, 错误: {error_message}") + except Exception as db_error: + logger.error(f"[{plugin_name}] 记录插件统计数据失败: {db_error}") + + # 重新抛出异常,让上层处理 + raise + except Exception as outer_error: + logger.error(f"[{plugin_name}] 装饰器外层错误: {outer_error}") + logger.error(traceback.format_exc()) + # 确保原始函数仍然被调用,即使装饰器出错 + return func(self, message) return wrapper