跳到主要内容

定时推送日志

  • 在服务器中每天定时导出pm2日志、nginx的error日志,推送到飞书
  • PM2 主要看 Node/Next 应用层异常,比如进程崩溃、内存溢出、未捕获异常、SSR 报错
  • Nginx error log 主要看 网关/反向代理层问题,比如 upstream 超时、502/504、连接被拒绝、请求体过大

在服务器中写运维脚本​

  • 使用crontab定时任务
  • crontab 定时执行
  • 读取PM2 日志、读取Nginx error log、统计 5xx、推送飞书

定时脚本流程​

  • 在服务器指定的定时任务脚本目录
text
/data/scripts/daily-log-report.sh
↓
读取 PM2 日志
↓
读取 Nginx error/access 日志
↓
统计昨天 ERROR / 502 / 504
↓
curl 飞书 Webhook
↓
每天 09:00 crontab 自动执行

定时脚本实现​

text
#!/bin/bash

# cron 环境变量比较少,主动设置 PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# =========================
# 基础配置
# =========================

# 统计昨天
DATE=$(date -d "yesterday" "+%Y-%m-%d")

# PM2 日志
PM2_ERROR_LOG="/data/www/flextv/logs/flextv-error.log"

# Nginx 日志
NGINX_ERROR_LOG="/var/log/nginx/error.log"
NGINX_ACCESS_LOG="/var/log/nginx/access.log"

# 飞书机器人 Webhook
FEISHU_WEBHOOK="https://open.feishu.cn/open-apis/bot/v2/hook/你的Webhook"


# =========================
# PM2 日志统计
# =========================

PM2_ERROR_COUNT=$(grep -c "$DATE" "$PM2_ERROR_LOG" 2>/dev/null || true)

PM2_ERROR_DETAIL=$(grep "$DATE" "$PM2_ERROR_LOG" 2>/dev/null | tail -n 10)

if [ -z "$PM2_ERROR_DETAIL" ]; then
PM2_ERROR_DETAIL="无"
fi


# =========================
# Nginx Error 日志统计
# =========================

NGINX_ERROR_COUNT=$(grep -c "$DATE" "$NGINX_ERROR_LOG" 2>/dev/null || true)

NGINX_ERROR_DETAIL=$(grep "$DATE" "$NGINX_ERROR_LOG" 2>/dev/null | tail -n 10)

if [ -z "$NGINX_ERROR_DETAIL" ]; then
NGINX_ERROR_DETAIL="无"
fi


# =========================
# Nginx HTTP 状态码统计
# =========================

# 根据 access.log 格式统计昨天的 502 / 504
NGINX_502_COUNT=$(grep "$DATE" "$NGINX_ACCESS_LOG" 2>/dev/null | grep -c ' 502 ' || true)

NGINX_504_COUNT=$(grep "$DATE" "$NGINX_ACCESS_LOG" 2>/dev/null | grep -c ' 504 ' || true)


# =========================
# 飞书消息
# =========================

MESSAGE="【服务器日志日报】

日期:$DATE

PM2
- ERROR:$PM2_ERROR_COUNT

Nginx
- ERROR:$NGINX_ERROR_COUNT
- 502:$NGINX_502_COUNT
- 504:$NGINX_504_COUNT

PM2 最近错误:
$PM2_ERROR_DETAIL

Nginx 最近错误:
$NGINX_ERROR_DETAIL"


# =========================
# 推送飞书
# =========================

curl -s -X POST "$FEISHU_WEBHOOK" \
-H "Content-Type: application/json" \
-d "$(cat <<EOF
{
"msg_type": "text",
"content": {
"text": $(printf '%s' "$MESSAGE" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))')
}
}
EOF
)"


# =========================
# 记录脚本执行日志
# =========================

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 日志日报推送完成"