用统计脚本分析nginx日志生成流量趋势图的核心是:提取时间戳和字节数→按时间窗口聚合→输出csv→可视化;关键在数据清洗准确、时间分组合理、字节字段识别正确。

用统计脚本分析 Nginx 日志生成流量趋势图,核心是:提取时间戳和字节数 → 按时间窗口聚合 → 输出可绘图格式(如 CSV)→ 用工具可视化。关键不在“写多复杂的脚本”,而在于数据清洗准确、时间分组合理、字节字段识别正确。
确认日志格式并提取关键字段
Nginx 默认的 log_format 中,响应体大小通常由 $bytes_sent 或 $body_bytes_sent 记录。先检查你的日志是否包含该字段:
- 运行
head -1 /var/log/nginx/access.log看首行结构 - 若含
bytes_sent(如... "GET / HTTP/1.1" 200 1245 ...),第9或第10列常为字节数(依空格分割位置而定) - 若使用自定义格式(如含
$request_time或$upstream_response_length),需按实际字段名调整提取逻辑
用 awk 快速按小时聚合流量(推荐入门)
以下脚本将 access.log 按小时统计总字节数,并输出为 CSV(时间,字节数):
awk '{
# 提取第一列时间(形如 [10/Jan/2024:14:23:01)并截取到小时
t = substr($4, 2);
gsub(/:[^:]+$/, "", t);
key = t;
# 假设字节数在第10列(常见于默认日志),请根据实际调整 $10 → $9 或 $11
bytes += $10 + 0
}
END {
for (k in bytes) print k "," bytes[k]
}' /var/log/nginx/access.log | sort | tee hourly_bytes.csv
说明:
-
substr($4, 2)去掉开头的[,gsub截断分钟和秒,保留 “10/Jan/2024:14” -
$10 + 0防止空字段导致 awk 报错 - 输出示例:
10/Jan/2024:14,28492301
用 Python + pandas 做更灵活的趋势分析
适合需多维度(如状态码、URL 路径)或需要平滑曲线、同比环比的场景:
- 安装依赖:
pip install pandas matplotlib - 脚本要点:
- 用正则解析日志(推荐
nginx_log_parser库或自定义 pattern) - 将时间字符串转为
pd.Timestamp,设为索引 -
resample('1H').sum()['bytes_sent']自动按小时聚合 -
.plot(figsize=(12,5), title="Hourly Traffic")直接出图,.savefig("trend.png")保存
生成图表并注意几个易错点
拿到 CSV 后,可用多种方式画图:
- Excel / LibreOffice:导入 CSV → 插入折线图 → X轴选时间列(需设为日期格式)
- 命令行快速预览:
csvkit+gnuplot或用visidata交互查看 - 线上工具:把 CSV 粘贴到 Plotly Chart Studio,拖拽生成交互式趋势图
注意:
- 确保所有时间字段时区一致(Nginx 默认用系统时区,避免混用 UTC 和本地时间)
-
$bytes_sent包含响应头,$body_bytes_sent只含响应体——选哪个取决于你关心“总传输量”还是“有效载荷” - 大日志文件建议先
zcat access.log.*.gz | ...或用tail -n 100000测试脚本,再跑全量











