#!/bin/bash
#=====================================================
# Nginx 日志分析脚本 - 快速分析访问日志
# 来源: 整合自运维社区最佳实践
# 用法: ./nginx-log-analyze.sh [日志文件]
#=====================================================

LOG_FILE=${1:-/var/log/nginx/access.log}

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

if [ ! -f "$LOG_FILE" ]; then
    echo -e "${RED}日志文件不存在: $LOG_FILE${NC}"
    exit 1
fi

echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}    Nginx 日志分析报告${NC}"
echo -e "${GREEN}========================================${NC}"
echo "日志文件: $LOG_FILE"
echo "分析时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo ""

# 总请求数
TOTAL=$(wc -l < "$LOG_FILE")
echo -e "${BLUE}[ 总请求数 ]${NC}  ${TOTAL}"

# 状态码分布
echo ""
echo -e "${BLUE}[ 状态码分布 ]${NC}"
awk '{print $9}' "$LOG_FILE" | sort | uniq -c | sort -rn | head -10 | \
while read count code; do
    if [[ "$code" =~ ^2 ]]; then
        echo -e "  ${GREEN}${code}${NC}: ${count}"
    elif [[ "$code" =~ ^[45] ]]; then
        echo -e "  ${RED}${code}${NC}: ${count}"
    else
        echo "  ${code}: ${count}"
    fi
done

# TOP 10 IP
echo ""
echo -e "${BLUE}[ TOP 10 访问IP ]${NC}"
awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -rn | head -10 | \
awk '{printf "  %-6s %s\n", $1, $2}'

# TOP 10 URL
echo ""
echo -e "${BLUE}[ TOP 10 请求URL ]${NC}"
awk '{print $7}' "$LOG_FILE" | sort | uniq -c | sort -rn | head -10 | \
awk '{printf "  %-6s %s\n", $1, $2}'

# 流量统计
echo ""
echo -e "${BLUE}[ 流量统计 ]${NC}"
TOTAL_BYTES=$(awk '{sum+=$10} END {print sum}' "$LOG_FILE")
if [ "$TOTAL_BYTES" -gt 1073741824 ]; then
    echo "  总流量: $(echo "scale=2; $TOTAL_BYTES/1073741824" | bc) GB"
elif [ "$TOTAL_BYTES" -gt 1048576 ]; then
    echo "  总流量: $(echo "scale=2; $TOTAL_BYTES/1048576" | bc) MB"
else
    echo "  总流量: $(echo "scale=2; $TOTAL_BYTES/1024" | bc) KB"
fi

# 异常请求（4xx/5xx）
echo ""
echo -e "${RED}[ 最近的错误请求 (4xx/5xx) ]${NC}"
grep -E ' (4[0-9]{2}|5[0-9]{2}) ' "$LOG_FILE" | tail -10 | \
awk '{printf "  %s %s %s %s\n", $1, $9, $7, $11}' | sed 's/"//g'

# User-Agent 统计
echo ""
echo -e "${BLUE}[ 浏览器/设备分布 ]${NC}"
awk -F'"' '{print $6}' "$LOG_FILE" | sort | uniq -c | sort -rn | head -5 | \
while read count ua; do
    echo "  ${count}  $(echo "$ua" | cut -c1-60)"
done

echo ""
echo -e "${GREEN}========================================${NC}"