如何分析 Apache 访问日志里的流量峰值变化

作者:袖梨 2026-07-11
识别流量峰值需按小时/分钟聚合请求量,提取日志时间字段统计频次;结合7天同段基线或均值+2倍标准差判断异常;再关联200/404/400状态码及响应大小分析成因。

分析 Apache 访问日志中的流量峰值变化,核心是按时间粒度聚合请求量,并识别出显著高于均值的时段。关键不在于看单条记录,而在于统计规律、定位突变点、结合上下文判断是否异常或合理。

按小时/分钟统计请求频次

这是识别峰值最直接的方式。Apache 日志时间字段(第4个字段)格式为 [10/Oct/2023:13:55:36 +0800],需先提取时间单位:

  • 统计每小时请求数:awk '{match($4, /:[0-9]{2}:/); hour = substr($4, RSTART-2, 2); print hour}' access.log | sort | uniq -c | sort -nr
  • 统计每分钟请求数(更精细):awk '{match($4, /:[0-9]{2}:[0-9]{2}/); min = substr($4, RSTART-2, 5); print min}' access.log | sort | uniq -c | sort -nr | head -20

输出中数值明显偏高的行,就是潜在的流量高峰时段,比如 1472 14 表示 14 点整一小时有 1472 次请求。

对比基线识别异常跃升

单纯看最高值不够,需判断是否属于“异常峰值”。建议计算一个参考基线:

  • 取过去 7 天同小时段的平均请求量作为当日该小时的预期值
  • 用当前小时请求数除以该基线,比值 > 2 或 3 通常值得警惕
  • 可配合脚本自动计算:例如用 Python 读取多日日志,按 %H 分组求均值与标准差,标记超出 均值 + 2×标准差 的点

这种做法能区分“日常促销带来的合理高峰”和“爬虫暴打或攻击导致的异常突刺”。

关联状态码与响应大小辅助判断

流量峰值本身中性,但它的构成决定性质:

  • 若高峰时段 200 成比例上升,且主要来自正常页面(如 /product//api/v1/order),大概率是业务驱动
  • 若同时伴随大量 404(尤其路径含 /wp-admin//phpmyadmin/)、或 400/499 错误激增,可能是扫描或恶意请求
  • 若响应字节数(第7字段)在高峰时普遍偏低(如平均

命令示例:查看某高峰小时(如 14 点)的状态码分布:awk '$4 ~ /:14:[0-9]{2}:[0-9]{2}/ {print $9}' access.log | sort | uniq -c | sort -nr

可视化趋势更易发现周期性与拐点

文本统计适合快速筛查,但看变化趋势必须靠图:

  • 将每小时请求数导出为 CSV(列:hour, count),用 Excel 或 LibreOffice 绘制折线图,一眼可见双峰(早9点、晚8点)、单峰(仅午间)或突发尖刺
  • 使用 GoAccess:goaccess access.log --log-format=COMBINED -o report.html,生成带实时热力图的 HTML 报告,支持按小时/天维度切换
  • 长期监控推荐 ELK 或 Grafana + Loki:把日志流式接入,设置告警规则(如“过去10分钟请求数环比上涨300%”)

图形比数字更能暴露“缓慢爬升后突然爆发”或“持续高位运行”等模式差异。

相关文章

精彩推荐