加入装饰器,进行指令数据统计

This commit is contained in:
liuwei
2025-03-19 12:00:01 +08:00
parent e5a6d09cf9
commit 63c2d4c816

View File

@@ -1,6 +1,7 @@
import functools import functools
import time import time
import traceback import traceback
import logging
from datetime import datetime from datetime import datetime
from typing import Callable, Dict, Any, Tuple from typing import Callable, Dict, Any, Tuple
@@ -17,10 +18,18 @@ def plugin_stats_decorator(plugin_name: str) -> Callable:
Returns: Returns:
装饰器函数 装饰器函数
""" """
# 获取日志记录器
logger = logging.getLogger(f"StatsCollector.{plugin_name}")
logger.info(f"为插件 '{plugin_name}' 应用统计装饰器")
def decorator(func: Callable) -> Callable: def decorator(func: Callable) -> Callable:
logger.info(f"装饰 '{plugin_name}'{func.__name__} 方法")
@functools.wraps(func) @functools.wraps(func)
def wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: def wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]:
# 获取数据库连接 # 获取数据库连接
try:
logger.debug(f"[{plugin_name}] 开始处理消息")
db_manager = DBConnectionManager.get_instance() db_manager = DBConnectionManager.get_instance()
stats_db = StatsDBOperator(db_manager) stats_db = StatsDBOperator(db_manager)
@@ -29,17 +38,24 @@ def plugin_stats_decorator(plugin_name: str) -> Callable:
sender = message.get("sender", "") sender = message.get("sender", "")
roomid = message.get("roomid", "") roomid = message.get("roomid", "")
logger.debug(f"[{plugin_name}] 消息内容: '{content}', 发送者: {sender}, 群ID: {roomid}")
# 记录开始时间 # 记录开始时间
start_time = time.time() start_time = time.time()
logger.debug(f"[{plugin_name}] 开始执行时间: {datetime.fromtimestamp(start_time).strftime('%Y-%m-%d %H:%M:%S.%f')}")
try: try:
# 调用原始方法 # 调用原始方法
logger.debug(f"[{plugin_name}] 调用原始方法 {func.__name__}")
success, response = func(self, message) success, response = func(self, message)
# 计算执行时间(毫秒) # 计算执行时间(毫秒)
process_time_ms = (time.time() - start_time) * 1000 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( stats_db.record_plugin_call(
plugin_name=plugin_name, plugin_name=plugin_name,
command=content, command=content,
@@ -48,18 +64,23 @@ def plugin_stats_decorator(plugin_name: str) -> Callable:
success=success, success=success,
process_time_ms=process_time_ms process_time_ms=process_time_ms
) )
logger.info(f"[{plugin_name}] 成功记录插件调用: {content}, 耗时: {process_time_ms:.2f}ms")
return success, response return success, response
except Exception as e: except Exception as e:
# 计算执行时间(毫秒) # 计算执行时间(毫秒)
process_time_ms = (time.time() - start_time) * 1000 end_time = time.time()
process_time_ms = (end_time - start_time) * 1000
# 记录错误 # 记录错误
error_message = str(e) error_message = str(e)
stack_trace = traceback.format_exc() stack_trace = traceback.format_exc()
logger.error(f"[{plugin_name}] 执行出错: {error_message}")
logger.debug(f"[{plugin_name}] 错误堆栈: {stack_trace}")
try: try:
# 记录插件调用(失败) # 记录插件调用(失败)
logger.debug(f"[{plugin_name}] 记录插件调用失败统计")
stats_db.record_plugin_call( stats_db.record_plugin_call(
plugin_name=plugin_name, plugin_name=plugin_name,
command=content, command=content,
@@ -70,6 +91,7 @@ def plugin_stats_decorator(plugin_name: str) -> Callable:
) )
# 记录错误详情 # 记录错误详情
logger.debug(f"[{plugin_name}] 记录错误详情")
stats_db.record_error( stats_db.record_error(
plugin_name=plugin_name, plugin_name=plugin_name,
command=content, command=content,
@@ -78,11 +100,17 @@ def plugin_stats_decorator(plugin_name: str) -> Callable:
error_message=error_message, error_message=error_message,
stack_trace=stack_trace stack_trace=stack_trace
) )
logger.info(f"[{plugin_name}] 成功记录插件错误: {content}, 错误: {error_message}")
except Exception as db_error: except Exception as db_error:
print(f"记录插件统计数据失败: {db_error}") logger.error(f"[{plugin_name}] 记录插件统计数据失败: {db_error}")
# 重新抛出异常,让上层处理 # 重新抛出异常,让上层处理
raise raise
except Exception as outer_error:
logger.error(f"[{plugin_name}] 装饰器外层错误: {outer_error}")
logger.error(traceback.format_exc())
# 确保原始函数仍然被调用,即使装饰器出错
return func(self, message)
return wrapper return wrapper