#!/usr/bin/env bash # watch.sh — Clover 全站实时监控 # 用途: 倩倩姐操作页面时, 实时显示哪个请求出错(4xx/5xx)、哪里抛异常。 # 用法: bash backend/scripts/watch.sh # 只看错误(默认, 干净) # bash backend/scripts/watch.sh --all # 看全部请求(含正常) # 退出: Ctrl-C set -u MODE="${1:-errors}" # errors(默认只看错误) | --all(全部) # 颜色 R=$'\033[31m'; G=$'\033[32m'; Y=$'\033[33m'; B=$'\033[36m'; DIM=$'\033[2m'; N=$'\033[0m' echo "${B}========================================${N}" echo "${B} Clover 实时监控 (Ctrl-C 退出)${N}" if [ "$MODE" = "--all" ]; then echo " 模式: 全部请求" else echo " 模式: 只看错误 (加 --all 看全部)" fi echo "${B}========================================${N}" echo "${DIM}盯着: clover_api + clover_worker. 现在去浏览器操作, 出错会标红.${N}" echo "" # 同时跟随 api 和 worker 日志, 每行打上来源标签 { docker logs -f --tail 0 clover_api 2>&1 | sed "s/^/[API] /" & API_PID=$! docker logs -f --tail 0 clover_worker 2>&1 | sed "s/^/[WRK] /" & WRK_PID=$! trap "kill $API_PID $WRK_PID 2>/dev/null" EXIT INT TERM wait } | while IFS= read -r line; do # 过滤纯噪音: 健康检查 + SQLAlchemy 回显 case "$line" in *"/health"*) continue ;; *"sqlalchemy"*|*"SELECT "*|*"FROM "*|*"WHERE "*|*"LIMIT "*|*"INSERT "*|*"UPDATE "*|*"BEGIN "*|*"COMMIT"*|*"ROLLBACK"*) continue ;; esac ts=$(date '+%H:%M:%S') # 1) HTTP 请求行: 提取状态码 if echo "$line" | grep -qE '"(GET|POST|PUT|DELETE|PATCH) '; then code=$(echo "$line" | grep -oE 'HTTP/1\.1" [0-9]{3}' | grep -oE '[0-9]{3}$') req=$(echo "$line" | grep -oE '"(GET|POST|PUT|DELETE|PATCH) [^"]*"') src=$(echo "$line" | grep -oE '^\[[A-Z]+\]') case "$code" in 2*) [ "$MODE" = "--all" ] && echo "${DIM}${ts} ${src} ${G}${code}${N}${DIM} ${req}${N}" ;; 4*) echo "${ts} ${src} ${Y}${code} ⚠ 客户端错误${N} ${req}" ;; 5*) echo "${ts} ${src} ${R}${code} ✖ 服务端错误${N} ${req}" ;; *) [ "$MODE" = "--all" ] && echo "${ts} ${src} ${code} ${req}" ;; esac continue fi # 2) 异常/报错/堆栈: 永远显示并标红 if echo "$line" | grep -qiE "error|exception|traceback|critical|失败|拒绝|unauthorized|forbidden|raise"; then echo "${ts} ${R}${line}${N}" continue fi # 3) WARNING 级: 黄色提示 if echo "$line" | grep -qE "WARNING|warn"; then echo "${ts} ${Y}${line}${N}" continue fi # 4) 其余行仅在 --all 模式显示 [ "$MODE" = "--all" ] && echo "${DIM}${ts} ${line}${N}" done