Files
ai-team-dashboard/dashboard/analyze-logs.sh
fang 5f14174bb9 feat: 添加 Dashboard 完整日志监控系统 v1.1.0
 新增功能
- 完整的日志记录系统(6 种日志级别)
- 日志配置功能(可通过 config.json 控制)
- 性能监控装饰器和请求日志中间件
- 7 个管理工具脚本
- 完整的文档和使用指南

🛠️ 管理工具
- start-with-log.sh: 启动脚本(带日志)
- stop-dashboard.sh: 停止脚本
- view-logs.sh: 日志查看器
- monitor-logs.sh: 实时监控工具(支持多种过滤器)
- analyze-logs.sh: 日志分析工具(自动生成报告)
- demo-logging.sh: 功能演示脚本
- test-logging-config.sh: 配置测试工具

📊 日志特性
- 支持 INFO/SUCCESS/WARN/ERROR/DEBUG/PERF 6 种级别
- 自动记录启动过程、API 请求、性能统计
- 缓存命中情况追踪
- 分步性能监控
- 智能过滤器

⚙️ 配置功能
- 可控制是否启用日志(默认:true)
- 可设置日志级别(默认:INFO)
- 可控制文件/控制台输出
- 支持动态配置(重启生效)

📚 文档
- LOGGING_GUIDE.md: 完整使用指南
- LOGGING_CONFIG.md: 配置说明文档
- LOGGING_CONFIG_QUICK.md: 快速配置指南
- 多个中文说明文档

🔒 安全
- 添加 .gitignore 排除敏感信息
- config.json(含 Token)不提交
- 日志文件不提交
- 示例配置使用占位符

 测试
- 语法检查通过
- 功能完整性验证
- 配置控制测试通过
- 文档完整性检查

详见 CHANGELOG_v1.1.0.md

Made-with: Cursor
2026-03-11 11:37:35 +08:00

247 lines
11 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 ""