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
上一篇下一篇

猜你喜欢

热点阅读