Linux下统计Nginx的log日志常用命令

分类: 服务器 > Linux

日常工作中收集的可快速根据NGINX的access.log日志统计各类访问信息命令:


访问IP相关统计

统计IP访问量(PV): 

awk '{print $1}' access.log | wc -l

独立IP访问统计(UV): 

awk '{print $1}' access.log | sort -n | uniq | wc -l

查看某一时间段的IP访问量(8-9点): grep "05/Oct/2022:0[8-9]" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | wc -l

查看访问最频繁的前100个IP: 

awk '{print $1}' access.log | sort -n | uniq -c | sort -rn | head -n 100

查看访问次数在100次以上的IP: 

awk '{print $1}' access.log | sort -n | uniq -c | awk '{if($1>100)print $0}' | sort -rn

查看某个IP的详细访问情况,按访问频率排序: 

grep '127.0.0.1' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -n 100


页面访问统计

查看访问最频繁的页面(top 100): 

awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -n 100

查看访问最频繁的页面(排除php页面)(top 100): 

grep -v '.php' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -n 100

查看页面访问次数超过100次的页面:

cat access.php | cut -d ' ' -f 7 | sort  | uniq -c | awk '{if($1>100)print $0}' | less

查看最近1000条记录中访问量最高的页面: 

tail -1000 access.php | awk '{print $7}' | sort | uniq -c | sort -nr | less


请求量统计

统计每秒的请求数,top100的时间点(精确到秒):  

awk '{print $4}' access.log | cut -c 14-21 | sort | uniq -c | sort -nr | head -n 100

统计每分钟的请求数,top100的时间点(精确到分钟): 

awk '{print $4}' access.log | cut -c 14-18 | sort | uniq -c | sort -nr | head -n 100

统计每小时的请求数,top100的时间点(精确到小时): 

awk '{print $4}' access.log | cut -c 14-15 | sort | uniq -c | sort -nr | head -n 100


性能分析

前置:在nginx的log中最后一个字段加入$request_time

列出传输时间超过3秒的页面,显示前20条:

cat access.php | awk '($NF > 3){print $7}' | sort -n | uniq -c | sort -nr | head -20

列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条:

cat access.php | awk '($NF > 1 && $7~/\.php/){print $7}' | sort -n | uniq -c | sort -nr | head -100

TCP链接统计

查看当前TCP连接数

netstat -tan | grep "ESTABISHED" | grep ":80" | wc -l

【参数说明】

CLOSED:无连接是活动的或正在进行

ESTABLISHED:正常数据传输状态

TIME_WAIT:处理完毕,等待超时结束的请求数

LISTEN:服务器在等待进入呼叫

SYN_RECV:一个连接请求已经到达,等待确认

SYN_SENT:应用已经开始,打开一个连接

ESTABLISHED:正常数据传输状态

FIN_WAIT1:应用说它已经完成

FIN_WAIT2:另一边已同意释放

ITMED_WAIT:等待所有分组死掉

CLOSING:两边同时尝试关闭

TIME_WAIT:另一边已初始化一个释放

LAST_ACK:等待所有分组死掉

用tcpdump嗅探80端口的最高访问

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F "." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr

来源:原创 发布时间:2022-03-06 21:46:07