247 lines
11 KiB
Bash
247 lines
11 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
|
|||
|
|
# AI Team Dashboard 日志分析工具
|
|||
|
|
# 分析日志中的性能数据、请求统计和错误报告
|
|||
|
|
|
|||
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|||
|
|
LOG_FILE="$SCRIPT_DIR/logs/dashboard.log"
|
|||
|
|
|
|||
|
|
# 颜色定义
|
|||
|
|
COLOR_RESET='\033[0m'
|
|||
|
|
COLOR_CYAN='\033[36m'
|
|||
|
|
COLOR_GREEN='\033[32m'
|
|||
|
|
COLOR_YELLOW='\033[33m'
|
|||
|
|
COLOR_RED='\033[31m'
|
|||
|
|
COLOR_PURPLE='\033[35m'
|
|||
|
|
COLOR_BOLD='\033[1m'
|
|||
|
|
|
|||
|
|
# 检查日志文件
|
|||
|
|
if [ ! -f "$LOG_FILE" ]; then
|
|||
|
|
echo -e "${COLOR_RED}❌ 日志文件不存在: $LOG_FILE${COLOR_RESET}"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
clear
|
|||
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|||
|
|
echo -e "${COLOR_BOLD}🦞 AI Team Dashboard 日志分析报告${COLOR_RESET}"
|
|||
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# ═══════════════ 基础统计 ═══════════════
|
|||
|
|
echo -e "${COLOR_CYAN}📊 基础统计${COLOR_RESET}"
|
|||
|
|
echo "─────────────────────────────────────────"
|
|||
|
|
|
|||
|
|
TOTAL_LINES=$(wc -l < "$LOG_FILE" 2>/dev/null || echo 0)
|
|||
|
|
INFO_COUNT=$(grep -c '\[INFO\]' "$LOG_FILE" 2>/dev/null || echo 0)
|
|||
|
|
SUCCESS_COUNT=$(grep -c '\[SUCCESS\]' "$LOG_FILE" 2>/dev/null || echo 0)
|
|||
|
|
WARN_COUNT=$(grep -c '\[WARN\]' "$LOG_FILE" 2>/dev/null || echo 0)
|
|||
|
|
ERROR_COUNT=$(grep -c '\[ERROR\]' "$LOG_FILE" 2>/dev/null || echo 0)
|
|||
|
|
PERF_COUNT=$(grep -c '\[PERF\]' "$LOG_FILE" 2>/dev/null || echo 0)
|
|||
|
|
|
|||
|
|
echo " 总日志行数: $TOTAL_LINES"
|
|||
|
|
echo -e " ${COLOR_CYAN}ℹ️ INFO: $INFO_COUNT${COLOR_RESET}"
|
|||
|
|
echo -e " ${COLOR_GREEN}✅ SUCCESS: $SUCCESS_COUNT${COLOR_RESET}"
|
|||
|
|
echo -e " ${COLOR_YELLOW}⚠️ WARN: $WARN_COUNT${COLOR_RESET}"
|
|||
|
|
echo -e " ${COLOR_RED}❌ ERROR: $ERROR_COUNT${COLOR_RESET}"
|
|||
|
|
echo -e " ${COLOR_PURPLE}⏱️ PERF: $PERF_COUNT${COLOR_RESET}"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# ═══════════════ 启动信息 ═══════════════
|
|||
|
|
echo -e "${COLOR_CYAN}🚀 启动信息${COLOR_RESET}"
|
|||
|
|
echo "─────────────────────────────────────────"
|
|||
|
|
|
|||
|
|
LAST_START=$(grep '正在初始化' "$LOG_FILE" 2>/dev/null | tail -1)
|
|||
|
|
STARTUP_SUCCESS=$(grep 'Dashboard 启动成功' "$LOG_FILE" 2>/dev/null | tail -1)
|
|||
|
|
|
|||
|
|
if [ -n "$LAST_START" ]; then
|
|||
|
|
echo " 最后启动时间: $(echo "$LAST_START" | grep -oE '\[.*?\]' | head -1 | tr -d '[]')"
|
|||
|
|
if [ -n "$STARTUP_SUCCESS" ]; then
|
|||
|
|
echo -e " ${COLOR_GREEN}状态: 启动成功 ✅${COLOR_RESET}"
|
|||
|
|
else
|
|||
|
|
echo -e " ${COLOR_YELLOW}状态: 启动中或启动失败 ⚠️${COLOR_RESET}"
|
|||
|
|
fi
|
|||
|
|
else
|
|||
|
|
echo -e " ${COLOR_YELLOW}未找到启动记录${COLOR_RESET}"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 显示配置加载信息
|
|||
|
|
CONFIG_LOAD=$(grep '配置文件加载成功' "$LOG_FILE" 2>/dev/null | tail -1)
|
|||
|
|
if [ -n "$CONFIG_LOAD" ]; then
|
|||
|
|
echo " 配置加载: 成功"
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# ═══════════════ API 请求统计 ═══════════════
|
|||
|
|
echo -e "${COLOR_CYAN}📡 API 请求统计${COLOR_RESET}"
|
|||
|
|
echo "─────────────────────────────────────────"
|
|||
|
|
|
|||
|
|
API_TOTAL=$(grep -c '\[API\]' "$LOG_FILE" 2>/dev/null || echo 0)
|
|||
|
|
echo " 总请求数: $API_TOTAL"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
if [ "$API_TOTAL" -gt 0 ]; then
|
|||
|
|
echo " 请求分布:"
|
|||
|
|
grep '\[API\]' "$LOG_FILE" 2>/dev/null | grep -oE 'GET /api/[^ ]+|POST /api/[^ ]+' | sort | uniq -c | sort -rn | head -10 | while read count endpoint; do
|
|||
|
|
echo " $endpoint: $count 次"
|
|||
|
|
done
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# 最近的请求
|
|||
|
|
echo " 最近 5 次请求:"
|
|||
|
|
grep '\[API\]' "$LOG_FILE" 2>/dev/null | tail -5 | while read line; do
|
|||
|
|
TIME=$(echo "$line" | grep -oE '\[.*?\]' | head -1 | tr -d '[]' | cut -d' ' -f2)
|
|||
|
|
ENDPOINT=$(echo "$line" | grep -oE 'GET /api/[^ ]+|POST /api/[^ ]+')
|
|||
|
|
DURATION=$(echo "$line" | grep -oE '[0-9]+ms' | head -1)
|
|||
|
|
echo " [$TIME] $ENDPOINT - $DURATION"
|
|||
|
|
done
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# ═══════════════ 性能统计 ═══════════════
|
|||
|
|
echo -e "${COLOR_PURPLE}⏱️ 性能统计${COLOR_RESET}"
|
|||
|
|
echo "─────────────────────────────────────────"
|
|||
|
|
|
|||
|
|
if [ "$PERF_COUNT" -gt 0 ]; then
|
|||
|
|
echo " 操作耗时统计(平均值):"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# API 请求平均耗时
|
|||
|
|
API_PERF=$(grep '\[PERF\].*GET /api/monitor' "$LOG_FILE" 2>/dev/null | grep -oE '\([0-9]+ms\)' | tr -d '()ms' || echo "")
|
|||
|
|
if [ -n "$API_PERF" ]; then
|
|||
|
|
API_COUNT=$(echo "$API_PERF" | wc -l)
|
|||
|
|
API_AVG=$(echo "$API_PERF" | awk '{sum+=$1} END {if(NR>0) print int(sum/NR); else print 0}')
|
|||
|
|
API_MAX=$(echo "$API_PERF" | sort -n | tail -1)
|
|||
|
|
echo " 📊 GET /api/monitor:"
|
|||
|
|
echo " 调用次数: $API_COUNT"
|
|||
|
|
echo " 平均耗时: ${API_AVG}ms"
|
|||
|
|
echo " 最大耗时: ${API_MAX}ms"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# GitHub Issues 获取耗时
|
|||
|
|
GH_ISSUES_PERF=$(grep '\[PERF\].*getGitHubIssues' "$LOG_FILE" 2>/dev/null | grep -oE '\([0-9]+ms\)' | tr -d '()ms' || echo "")
|
|||
|
|
if [ -n "$GH_ISSUES_PERF" ]; then
|
|||
|
|
GH_COUNT=$(echo "$GH_ISSUES_PERF" | wc -l)
|
|||
|
|
GH_AVG=$(echo "$GH_ISSUES_PERF" | awk '{sum+=$1} END {if(NR>0) print int(sum/NR); else print 0}')
|
|||
|
|
GH_MAX=$(echo "$GH_ISSUES_PERF" | sort -n | tail -1)
|
|||
|
|
echo ""
|
|||
|
|
echo " 🐙 GitHub Issues 获取:"
|
|||
|
|
echo " 调用次数: $GH_COUNT"
|
|||
|
|
echo " 平均耗时: ${GH_AVG}ms"
|
|||
|
|
echo " 最大耗时: ${GH_MAX}ms"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# Docker 状态检查耗时
|
|||
|
|
DOCKER_PERF=$(grep '\[PERF\].*getDockerStatus' "$LOG_FILE" 2>/dev/null | grep -oE '\([0-9]+ms\)' | tr -d '()ms' || echo "")
|
|||
|
|
if [ -n "$DOCKER_PERF" ]; then
|
|||
|
|
DOCKER_COUNT=$(echo "$DOCKER_PERF" | wc -l)
|
|||
|
|
DOCKER_AVG=$(echo "$DOCKER_PERF" | awk '{sum+=$1} END {if(NR>0) print int(sum/NR); else print 0}')
|
|||
|
|
DOCKER_MAX=$(echo "$DOCKER_PERF" | sort -n | tail -1)
|
|||
|
|
echo ""
|
|||
|
|
echo " 🐳 Docker 状态检查:"
|
|||
|
|
echo " 调用次数: $DOCKER_COUNT"
|
|||
|
|
echo " 平均耗时: ${DOCKER_AVG}ms"
|
|||
|
|
echo " 最大耗时: ${DOCKER_MAX}ms"
|
|||
|
|
fi
|
|||
|
|
else
|
|||
|
|
echo " 暂无性能数据"
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# ═══════════════ 缓存统计 ═══════════════
|
|||
|
|
echo -e "${COLOR_CYAN}💾 缓存使用统计${COLOR_RESET}"
|
|||
|
|
echo "─────────────────────────────────────────"
|
|||
|
|
|
|||
|
|
CACHE_HITS=$(grep '使用缓存' "$LOG_FILE" 2>/dev/null | wc -l || echo 0)
|
|||
|
|
echo " 缓存命中次数: $CACHE_HITS"
|
|||
|
|
|
|||
|
|
if [ "$CACHE_HITS" -gt 0 ]; then
|
|||
|
|
ISSUES_CACHE=$(grep 'Issues 使用缓存' "$LOG_FILE" 2>/dev/null | wc -l || echo 0)
|
|||
|
|
COMMITS_CACHE=$(grep 'Commits 使用缓存' "$LOG_FILE" 2>/dev/null | wc -l || echo 0)
|
|||
|
|
echo " - Issues 缓存: $ISSUES_CACHE 次"
|
|||
|
|
echo " - Commits 缓存: $COMMITS_CACHE 次"
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# ═══════════════ 错误和警告 ═══════════════
|
|||
|
|
if [ "$ERROR_COUNT" -gt 0 ] || [ "$WARN_COUNT" -gt 0 ]; then
|
|||
|
|
echo -e "${COLOR_RED}⚠️ 错误和警告${COLOR_RESET}"
|
|||
|
|
echo "─────────────────────────────────────────"
|
|||
|
|
|
|||
|
|
if [ "$ERROR_COUNT" -gt 0 ]; then
|
|||
|
|
echo -e " ${COLOR_RED}❌ 错误 ($ERROR_COUNT 个):${COLOR_RESET}"
|
|||
|
|
grep '\[ERROR\]' "$LOG_FILE" 2>/dev/null | tail -5 | while read line; do
|
|||
|
|
TIME=$(echo "$line" | grep -oE '\[.*?\]' | head -1 | tr -d '[]' | cut -d' ' -f2)
|
|||
|
|
MSG=$(echo "$line" | sed 's/.*\[ERROR\]//')
|
|||
|
|
echo " [$TIME] $MSG"
|
|||
|
|
done
|
|||
|
|
echo ""
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ "$WARN_COUNT" -gt 0 ]; then
|
|||
|
|
echo -e " ${COLOR_YELLOW}⚠️ 警告 ($WARN_COUNT 个):${COLOR_RESET}"
|
|||
|
|
grep '\[WARN\]' "$LOG_FILE" 2>/dev/null | tail -5 | while read line; do
|
|||
|
|
TIME=$(echo "$line" | grep -oE '\[.*?\]' | head -1 | tr -d '[]' | cut -d' ' -f2)
|
|||
|
|
MSG=$(echo "$line" | sed 's/.*\[WARN\]//')
|
|||
|
|
echo " [$TIME] $MSG"
|
|||
|
|
done
|
|||
|
|
echo ""
|
|||
|
|
fi
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# ═══════════════ Docker 和 Gateway 状态 ═══════════════
|
|||
|
|
echo -e "${COLOR_CYAN}🐳 容器和服务状态${COLOR_RESET}"
|
|||
|
|
echo "─────────────────────────────────────────"
|
|||
|
|
|
|||
|
|
DOCKER_CHECKS=$(grep 'Docker 状态获取' "$LOG_FILE" 2>/dev/null | wc -l || echo 0)
|
|||
|
|
GATEWAY_CHECKS=$(grep 'Gateway.*健康检查' "$LOG_FILE" 2>/dev/null | wc -l || echo 0)
|
|||
|
|
GATEWAY_SUCCESS=$(grep 'Gateway.*健康检查通过' "$LOG_FILE" 2>/dev/null | wc -l || echo 0)
|
|||
|
|
GATEWAY_FAILED=$(grep 'Gateway.*健康检查失败' "$LOG_FILE" 2>/dev/null | wc -l || echo 0)
|
|||
|
|
|
|||
|
|
echo " Docker 状态检查: $DOCKER_CHECKS 次"
|
|||
|
|
echo " Gateway 健康检查:"
|
|||
|
|
echo " - 总次数: $GATEWAY_CHECKS"
|
|||
|
|
echo -e " - ${COLOR_GREEN}成功: $GATEWAY_SUCCESS${COLOR_RESET}"
|
|||
|
|
echo -e " - ${COLOR_RED}失败: $GATEWAY_FAILED${COLOR_RESET}"
|
|||
|
|
|
|||
|
|
if [ "$GATEWAY_CHECKS" -gt 0 ]; then
|
|||
|
|
LATEST_GATEWAY=$(grep 'Gateway.*健康检查' "$LOG_FILE" 2>/dev/null | tail -1)
|
|||
|
|
if [ -n "$LATEST_GATEWAY" ]; then
|
|||
|
|
echo ""
|
|||
|
|
echo " 最近检查: $(echo "$LATEST_GATEWAY" | grep -oE '\[.*?\]' | head -1 | tr -d '[]')"
|
|||
|
|
if echo "$LATEST_GATEWAY" | grep -q "通过"; then
|
|||
|
|
echo -e " ${COLOR_GREEN}状态: 正常 ✅${COLOR_RESET}"
|
|||
|
|
else
|
|||
|
|
echo -e " ${COLOR_RED}状态: 异常 ❌${COLOR_RESET}"
|
|||
|
|
fi
|
|||
|
|
fi
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# ═══════════════ 建议 ═══════════════
|
|||
|
|
echo -e "${COLOR_CYAN}💡 优化建议${COLOR_RESET}"
|
|||
|
|
echo "─────────────────────────────────────────"
|
|||
|
|
|
|||
|
|
if [ "$ERROR_COUNT" -gt 10 ]; then
|
|||
|
|
echo -e " ${COLOR_RED}⚠️ 错误数量较多 ($ERROR_COUNT 个),建议检查日志并修复问题${COLOR_RESET}"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ "$GATEWAY_FAILED" -gt "$GATEWAY_SUCCESS" ]; then
|
|||
|
|
echo -e " ${COLOR_YELLOW}⚠️ Gateway 健康检查失败率较高,请检查 OpenClaw 服务${COLOR_RESET}"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ -n "$API_AVG" ] && [ "$API_AVG" -gt 1000 ]; then
|
|||
|
|
echo -e " ${COLOR_YELLOW}⚠️ API 平均响应时间较慢 (${API_AVG}ms),可能影响用户体验${COLOR_RESET}"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ "$CACHE_HITS" -lt 10 ] && [ "$API_TOTAL" -gt 20 ]; then
|
|||
|
|
echo -e " ${COLOR_YELLOW}💡 缓存命中率较低,考虑增加缓存时间${COLOR_RESET}"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ "$ERROR_COUNT" -eq 0 ] && [ "$WARN_COUNT" -lt 5 ]; then
|
|||
|
|
echo -e " ${COLOR_GREEN}✅ 系统运行良好,无明显问题${COLOR_RESET}"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|||
|
|
echo ""
|