统计 Nginx 日志中的流量,通常是从 访问日志(access log) 里提取响应大小字段进行汇总。下面按常见场景给你一套实用方法。
常见 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
awk '{print $4}' access.log | cut -d: -f1 | uniq -c
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
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
awk '{url[$7]+=$10} END {for (u in url) print url[u], u}' access.log | sort -nr
goaccess access.log -o report.html --log-format=COMBINED
支持:
body_bytes_sent ≠ 真实网卡流量
$bytes_sentiftop, nload, vnstat)grep / zcat 再统计如果你愿意,可以把 你的 nginx 日志格式和一行真实日志 发出来,我可以帮你写精确可用的统计命令。