nginx日志分析

首先,nginx不同的输出有不同的过滤格式,分析的案例也得做对应的修改。以下是我的nginx日志配置和对应的日志输出。

nginx日志配置如下:

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

nginx日志输出格式如下:

127.0.0.1 - - [28/Apr/2017:18:15:05 +0800] "GET / HTTP/1.1" 200 96150 0.000 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"

 

1: 实时查看nginx的访问日志,过滤自己想要的字段

tail -f /usr/local/nginx/logs/access.log 

182749_wIy2_1588616.png

只想看状态码 tail -f /usr/local/nginx/logs/access.log |awk '{print $9}'

182926_dcG8_1588616.png

只看502的请求tail -f /usr/local/nginx/logs/access.log |awk '$9~/502/'

211816_L0gl_1588616.png

$1是用户ip,$4是时间,$7是用户访问url,$10是响应大小,$11是响应时间,可根据自己的需要进行过滤。

 

2: 分析每个ip,url的访问量,状态码量等

每个ip的访问量:cat /usr/local/nginx/logs/access.log |awk '{print $1}'|sort |uniq -c

183237_kyXW_1588616.png

每个url的访问量:cat /usr/local/nginx/logs/access.log |awk '{print $7}'|sort |uniq -c

183325_NOrk_1588616.png

每个状态码量:cat /usr/local/nginx/logs/access.log |awk '{print $9}'|sort |uniq -c

211000_LfUV_1588616.png

 

3: 统计每秒,每分钟,每小时的pv量

每秒的pv:cat  /usr/local/nginx/logs/access.log |awk '{print $4}'|sort |uniq -c|sort -nrk 1|more

190913_MLdL_1588616.png

每分的pv从大到小排序: cat  /usr/local/nginx/logs/access.log |awk '{print $4}'|cut -b 2-19|sort |uniq -c|sort -nrk 1|more

191009_YgWc_1588616.png

 

4: 统计一分钟,每个请求的平均响应时间

cat /usr/local/nginx/logs/access.log |awk '{print $4}'|cut -b 2-19|sort |uniq  -c|while read line;do 
    count=`echo $line|awk '{print $1}'`;  #count为每分钟的请求量
    time=`echo $line|awk '{print $2}'`;  #时间点
    cat /usr/local/nginx/logs/access.log|grep $time|awk '{sum=sum+$11}END{print "time:"time";response time every request:"sum/count}' count=${count} time=${time} #总时间/请求量算出每个请求的响应时间。
done

210724_yRJO_1588616.png

 

5: 截取nginx最后一分钟访问日志,可用来分析nginx状态码的比例,nginx响应时间等等。

LANG=C
agominute=`date -d '+1 minute ago' '+[%d/%b/%Y:%H:%M'` #前一分钟的日志格式
tac /usr/local/nginx/logs/access.log|awk '{if(substr($4,0,18) == agominute){print $0}else if($4<agominute){exit}}' agominute="${agominute}" #使用tac来分析,预防统计出现性能问题,当日志时间小于前一分钟,就立即退出,避免分析不必要的日志。

211041_SynZ_1588616.png

 

结合以上脚本,就可以对nginx日志进行实时监控了,例如,截取最后一分钟日志,分析502、500等占用请求数的总比例来监控是否服务器出异常了。

 

最后附上本人的网络课堂地址,如有兴趣请点击: 实践哥

转载于:https://my.oschina.net/zhuangweihong/blog/889415

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值