Nginx 请求日志统计(无废话)
2019-01-23 本文已影响0人
爱蛇
不废话,直接上配置跟代码
1. 先将nginx 日志格式调整如下:
http {
log_format MyFormat '$remote_addr | $remote_user | [$time_local] | $status | $request_time | $upstream_response_time | '
'$request_method | $http_host | $request_uri | '
'$request_length | $body_bytes_sent | "$http_referer" | "$http_user_agent"';
}
选用日志格式:
server {
access_log /home/wwwlogs/xxxxx.log MyFormat;
}
注意这里的MyFormat 与上面log_format指令后面的名字是一致的.
得出结果如下:
120.76.16.232 | - | [18/Jan/2019:20:19:10 +0800] | 200 | 0.193 | 0.193 | POST | xbedclean.xbed.com.cn | /admin/appOrderAction/list | 758 | 3504 | "-" | "Dalvik/2.1.0 (Linux; U; Android 7.0; MI 5s MIUI/V10.1.1.0.NAGCNFI)"
2. IP统计脚本(通过awk命令统计):
# /bin/bash
echo "usage: xxx.sh xxx.log"
awk -F '|' '{ g[$1]=$1; ip[$1]=$2 } END { for(i in g) print g[i]":"ip[i] }' $1
注意:这里不能出现 BEGIN ,只能出现一个END才能统计
3. 请求统计脚本(通过awk命令统计)
(会统计调用次数、总时间、平均耗时)
#! /bin/bash
# Usage: xx.sh {排序的列} {日志文件}
# e.g:
# xx.sh 4 xxx.log
# xx.sh 4 < xxx.log
# cat xxx.log | ./xx.sh 4
# 排序的列可选值:
# 1--url地址
# 2--请求次数
# 3--总消耗时间
# 4--平均消耗时间
#
# 本脚本用于统计url请求次数、平均消耗时间。
# 提醒: 会针对restful风格进行处理, 例如有/api/room/2000 , /api/room/1000,会当作同一个接口 /api/room
sortPos=4
if [ -n "$2" ]; then
sortPos=$2
fi
echo "url | request count | total seconds | avg seconds "
awk -F '|' ' { key=$9; pos=index(key,"?"); if(pos>0) key=substr(key,1,pos); } \
{ bef=key } \
{ gsub(/\/[0-9]+\?*$/,"",key) } \
{ gsub(/\/[0-9]+/,"",key) } \
{ af=key } \
{ keys[key]=key } \
{ _total_[key]=_total_[key]+$5 } \
{ reqCount[key]=reqCount[key]+1 } \
END \
{ for(k in keys) print keys[k],"|", reqCount[k] ,"|", _total_[k], "|" , _total_[k]/reqCount[k] }' $1 | sort -n -t '|' -k $sortPos
echo ""
echo "url | request count | total seconds | avg seconds "
4. 根据http状态码统计脚本
基于第3点里提到的脚本上改的
#! /bin/bash
# Usage: xx.sh {排序的列} {日志文件}
# e.g:
# xx.sh 200 xxx.log
# xx.sh 404 < xxx.log
# cat xxx.log | ./xx.sh 200
#
# 本脚本用于统计url请求次数、平均消耗时间。
# 提醒: 会针对restful风格进行处理, 例如有/api/room/2000 , /api/room/1000,会当作同一个接口 /api/room
httpStatus=200
if [ -n "$1" ]; then
httpStatus=$1
fi
echo "columns: url | request count "
awk -F '|' " { key=\$9; pos=index(key,\"?\"); if(pos>0) key=substr(key,1,pos); } \
{ gsub(/\/[0-9]+\?*$/,\"\",key) } \
{ gsub(/\/[0-9]+/,\"\",key) } \
{ if(\$4==$httpStatus) keys[key]=key } \
{ if(\$4==$httpStatus) reqCount[key]=reqCount[key]+1 } \
{ if(\$4==$httpStatus) lastTime[key]=\$3 } \
END \
{ for(k in keys) print keys[k],\"|\", reqCount[k] , \"|\", \"last request:\"lastTime[k] }" $2 | sort -t "|" -n -k 2
echo "columns: url | request count "
echo "summarize by http status:$httpStatus "
5. 分组统计状态码
用于统计一下有哪些状态码,进而可以下一步筛选
#! /bin/bash
# 分组统计状态码
# Usage: xx.sh {日志文件}
# e.g:
# xx.sh xxx.log
awk -F "|" '{print $4}' $1 |sort -nu