首先,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
只想看状态码 tail -f /usr/local/nginx/logs/access.log |awk '{print $9}'
只看502的请求tail -f /usr/local/nginx/logs/access.log |awk '$9~/502/'
$1是用户ip,$4是时间,$7是用户访问url,$10是响应大小,$11是响应时间,可根据自己的需要进行过滤。
2: 分析每个ip,url的访问量,状态码量等
每个ip的访问量:cat /usr/local/nginx/logs/access.log |awk '{print $1}'|sort |uniq -c
每个url的访问量:cat /usr/local/nginx/logs/access.log |awk '{print $7}'|sort |uniq -c
每个状态码量:cat /usr/local/nginx/logs/access.log |awk '{print $9}'|sort |uniq -c
3: 统计每秒,每分钟,每小时的pv量
每秒的pv:cat /usr/local/nginx/logs/access.log |awk '{print $4}'|sort |uniq -c|sort -nrk 1|more
每分的pv从大到小排序: cat /usr/local/nginx/logs/access.log |awk '{print $4}'|cut -b 2-19|sort |uniq -c|sort -nrk 1|more
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
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来分析,预防统计出现性能问题,当日志时间小于前一分钟,就立即退出,避免分析不必要的日志。
结合以上脚本,就可以对nginx日志进行实时监控了,例如,截取最后一分钟日志,分析502、500等占用请求数的总比例来监控是否服务器出异常了。
最后附上本人的网络课堂地址,如有兴趣请点击: 实践哥