美文网首页
Nginx 请求日志统计(无废话)

Nginx 请求日志统计(无废话)

作者: 爱蛇 | 来源:发表于2019-01-23 11:17 被阅读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
    

    相关文章

      网友评论

          本文标题:Nginx 请求日志统计(无废话)

          本文链接:https://www.haomeiwen.com/subject/ixjodqtx.html