处理异常信息展示功能
This commit is contained in:
@@ -95,9 +95,28 @@ def api_error_logs():
|
|||||||
try:
|
try:
|
||||||
server = current_app.dashboard_server
|
server = current_app.dashboard_server
|
||||||
days = request.args.get('days', 7, type=int)
|
days = request.args.get('days', 7, type=int)
|
||||||
limit = request.args.get('limit', 100, type=int)
|
limit = request.args.get('limit', 20, type=int)
|
||||||
logs = server.stats_db.get_error_logs(days, limit)
|
offset = request.args.get('offset', 0, type=int)
|
||||||
return jsonify({"success": True, "data": logs})
|
|
||||||
|
# 计算页码
|
||||||
|
page = (offset // limit) + 1
|
||||||
|
|
||||||
|
logs, total = server.stats_db.get_error_logs(days, page, limit)
|
||||||
|
|
||||||
|
# 补充用户和群组名称
|
||||||
|
for log in logs:
|
||||||
|
if log.get('user_id'):
|
||||||
|
log['user_name'] = server.contact_manager.get_nickname(log['user_id'])
|
||||||
|
if log.get('group_id'):
|
||||||
|
log['group_name'] = server.contact_manager.get_nickname(log['group_id'])
|
||||||
|
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"data": {
|
||||||
|
"logs": logs,
|
||||||
|
"total": total
|
||||||
|
}
|
||||||
|
})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"获取错误日志失败: {e}")
|
logger.error(f"获取错误日志失败: {e}")
|
||||||
return jsonify({"success": False, "error": str(e)}), 500
|
return jsonify({"success": False, "error": str(e)}), 500
|
||||||
|
|||||||
@@ -320,25 +320,39 @@ class StatsDBOperator(BaseDBOperator):
|
|||||||
"""
|
"""
|
||||||
return self.execute_query(sql, (days, limit)) or []
|
return self.execute_query(sql, (days, limit)) or []
|
||||||
|
|
||||||
def get_error_logs(self, days: int = 7, limit: int = 100) -> List[Dict]:
|
def get_error_logs(self, days: int = 7, page: int = 1, limit: int = 20) -> Tuple[List[Dict], int]:
|
||||||
"""获取错误日志
|
"""获取错误日志
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
days: 统计天数
|
days: 统计天数
|
||||||
limit: 返回记录数量限制
|
page: 页码
|
||||||
|
limit: 每页数量
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
错误日志列表
|
(日志列表, 总数)
|
||||||
"""
|
"""
|
||||||
|
# 1. 获取总数
|
||||||
|
count_sql = """
|
||||||
|
SELECT COUNT(*) as total
|
||||||
|
FROM t_error_logs
|
||||||
|
WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL %s DAY)
|
||||||
|
"""
|
||||||
|
count_result = self.execute_query(count_sql, (days,), fetch_one=True)
|
||||||
|
total = count_result['total'] if count_result else 0
|
||||||
|
|
||||||
|
# 2. 获取分页数据
|
||||||
|
offset = (page - 1) * limit
|
||||||
sql = """
|
sql = """
|
||||||
SELECT id, plugin_name, command, user_id, group_id,
|
SELECT id, plugin_name, command, user_id, group_id,
|
||||||
error_message, stack_trace, created_at
|
error_message, stack_trace, created_at
|
||||||
FROM t_error_logs
|
FROM t_error_logs
|
||||||
WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL %s DAY)
|
WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL %s DAY)
|
||||||
ORDER BY created_at DESC
|
ORDER BY created_at DESC
|
||||||
LIMIT %s
|
LIMIT %s OFFSET %s
|
||||||
"""
|
"""
|
||||||
return self.execute_query(sql, (days, limit)) or []
|
logs = self.execute_query(sql, (days, limit, offset)) or []
|
||||||
|
|
||||||
|
return logs, total
|
||||||
|
|
||||||
def get_error_detail(self, error_id: int) -> Optional[Dict]:
|
def get_error_detail(self, error_id: int) -> Optional[Dict]:
|
||||||
"""获取错误详情
|
"""获取错误详情
|
||||||
|
|||||||
@@ -232,8 +232,6 @@ class WeatherPlugin(MessagePluginInterface):
|
|||||||
|
|
||||||
# ================= 定时任务系统 =================
|
# ================= 定时任务系统 =================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def _execute_daily_push(self):
|
async def _execute_daily_push(self):
|
||||||
"""执行全量推送 (基于 ID 聚合)"""
|
"""执行全量推送 (基于 ID 聚合)"""
|
||||||
self.LOG.info("🚀 执行每日推送...")
|
self.LOG.info("🚀 执行每日推送...")
|
||||||
|
|||||||
Reference in New Issue
Block a user