温馨提示×

如何统计nginx日志流量

小樊
34
2026-10-24 22:09:26
栏目: 编程语言

统计 Nginx 日志中的流量,通常是从 访问日志(access log) 里提取响应大小字段进行汇总。下面按常见场景给你一套实用方法。


一、先确认 Nginx 日志格式

常见 log_format 示例:

log_format main '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent"';

关键字段:

  • $body_bytes_sent:发给客户端的字节数(不包含响应头)
  • 若用 $bytes_sent:包含响应头,更接近真实流量

查看你的日志格式:

grep log_format /etc/nginx/nginx.conf

二、统计总流量(最简单)

假设日志文件是 access.log,流量字段在第 10 列(示例格式):

awk '{sum+=$10} END {print sum}' access.log

结果单位是 字节(bytes)

换算成 MB:

awk '{sum+=$10} END {print sum/1024/1024 " MB"}' access.log

三、按时间统计流量

1️⃣ 按天统计

awk '{print $4}' access.log | cut -d: -f1 | uniq -c

2️⃣ 按小时统计流量

awk '{print $4, $10}' access.log | \
awk '{d=substr($1,2,11); h=substr($2,1,2); sum[d" "h]+=$3} \
END {for (i in sum) print i, sum[i]}' | sort

四、按 IP 统计流量(最常问)

awk '{ip[$1]+=$10} END {for (i in ip) print ip[i], i}' access.log | sort -nr

取流量最大的 10 个 IP:

awk '{ip[$1]+=$10} END {for (i in ip) print ip[i], i}' access.log | sort -nr | head

五、按 URL 统计流量

awk '{url[$7]+=$10} END {for (u in url) print url[u], u}' access.log | sort -nr

六、用 GoAccess(可视化,推荐)

goaccess access.log -o report.html --log-format=COMBINED

支持:

  • 总流量
  • 按 IP / URL / 时间
  • 图形界面

七、注意事项(很重要)

  1. body_bytes_sent ≠ 真实网卡流量
    • 不含请求头、TCP 开销
  2. 若想精确流量:
    • 用 $bytes_sent
    • 或看系统层(iftop, nload, vnstat)
  3. 大日志建议先 grep / zcat 再统计

如果你愿意,可以把 你的 nginx 日志格式和一行真实日志 发出来,我可以帮你写精确可用的统计命令。

0 踩