Nginx 访问日志统计与分析
access.log 是 nginx 访问日志,通过 awk/sort/uniq 组合可以快速统计请求量、来源、TOP IP 等。下面以字段方式说明常用统计命令。
1 日志格式
nginx 默认 log_format main 大致为:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
各字段按空格/"分隔,awk 默认以空白字符为分隔符({print $N} 取第 N 列)。
2 统计 client 请求数,按请求量从高到低排列
cat access.log | awk '{print $17}' | sort | uniq -c | sort -r | head
$17需按你的 log_format 调整,例如统计 IP 时取$1(remote_addr)。
2.1 按 IP 统计请求量 TOP N
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -n 20
字段:$1 → 客户端 IP;uniq -c 计数;sort -rn 按次数降序。
2.2 统计请求的域名(Host)分布
tail access.log -n 100000 | awk '{print $17}' | sort | uniq -c | head -n 10
2.3 统计 URL 请求量
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -n 20 # $7 为 URL
2.4 统计 HTTP 状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -rn
2.5 统计 TOP 来源 IP 的最小/最大响应时间
如果 log_format 里加了 request_time,可以按 IP 聚合并求平均耗时:
awk '{t[$1]+=$NF; n[$1]++} END{for(ip in t) printf "%d %d %s\n", n[ip], t[ip]/n[ip], ip}' \
access.log | sort -rn | head -n 20
3 时间窗口统计
统计某时间段内的请求量:
# 统计 9 点到 10 点之间的请求
awk '$4 >= "[09/Jan/2026:09:00:00" && $4 <= "[09/Jan/2026:10:00:00"' access.log | wc -l
4 常用命令组合说明
| 命令 | 作用 |
|---|---|
awk '{print $N}' |
取第 N 列 |
sort |
排序(需在 uniq 前) |
uniq -c |
去重并计数 |
sort -rn |
按数值降序 |
head |
取前 N 条,得到 TOP 排行 |
提示:统计前注意日志时间与
log_format的列定义,字段序号以实际配置为准。
阅读 —
·
全站 —