识别流量峰值需按小时/分钟聚合请求量,提取日志时间字段统计频次;结合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 次请求。
单纯看最高值不够,需判断是否属于“异常峰值”。建议计算一个参考基线:
%H 分组求均值与标准差,标记超出 均值 + 2×标准差 的点这种做法能区分“日常促销带来的合理高峰”和“爬虫暴打或攻击导致的异常突刺”。
流量峰值本身中性,但它的构成决定性质:
/product/、/api/v1/order),大概率是业务驱动/wp-admin/、/phpmyadmin/)、或 400/499 错误激增,可能是扫描或恶意请求命令示例:查看某高峰小时(如 14 点)的状态码分布:awk '$4 ~ /:14:[0-9]{2}:[0-9]{2}/ {print $9}' access.log | sort | uniq -c | sort -nr
文本统计适合快速筛查,但看变化趋势必须靠图:
goaccess access.log --log-format=COMBINED -o report.html,生成带实时热力图的 HTML 报告,支持按小时/天维度切换图形比数字更能暴露“缓慢爬升后突然爆发”或“持续高位运行”等模式差异。