靳闯博客 记录是一种习惯,分享是一种态度
  • 波浪
  • 波浪
  • 波浪
  • 波浪
nginx日志统计分析脚本
发表于: | 分类: 技术积累 | 标签: Nginx | 评论:0 | 阅读: 1389
一个nginx访问日志统计分析的的脚本

脚本功能(2018.12.19 更新和优化代码)

一、分析当天日志
二、分析昨天日志
三、分析历史日志

具体小功能:
1: 查询当天 [ALL请求ip排行] 统计
2: 查询当天 [ALL请求ip排行] 前40的统计
3: 查询当天 [请求ip次数最多的] 页面统计
4: 查询指定 [时间段ip请求] 排行统计
5: 查询当天 [ALL请求状态码] 统计
6: 查询指定 [状态码] 页面请求信息
7: 查询指定 [ip] ALL请求的页面
8: 查询指定 [关键词] 有关的记录

使用:修改下日志目录变量;只统计有关access的日志!

使用示例:
nginx日志格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';

比如当天日志目录为/data/nginx/logs ,修改变量为
daylogs="/data/nginx/logs"

比如历史日志目录为/logs ,修改变量为
logs="/logs"

历史日志 目录格式为:
/logs/
├── 20181021
│   ├── 20181021-access.log
│   ├── 20181021-blog.access.log
│   ├── 20181021-blog.error.log
│   ├── 20181021-error.log
│   ├── 20181021-me.access.log
│   ├── 20181021-me.access-sofw.log
│   ├── 20181021-me.error.log
│   ├── 20181021-www.access.log
│   └── 20181021-www.error.log
├── 20181022
│   ├── 20181022-access.log
│   ├── 20181022-blog.access.log
│   ├── 20181022-blog.error.log
│   ├── 20181022-error.log
│   ├── 20181022-me.access.log
│   ├── 20181022-me.access-sofw.log
│   ├── 20181022-me.error.log
│   ├── 20181022-www.access.log
│   └── 20181022-www.error.log
├── 20181023
  ·········

脚本

#!/bin/bash
#user: jinchuang

######## 获取昨天日期 ########
qian=`date -d "-1day" +%Y%m%d`

######## 历史日志目录 ########
logs="/logs"

######## 当天日志目录 ########
daylogs="/data/logs/nginx"

######## 处理临时目录 ########
[ -d /tmp/wclog ] || mkdir -p /tmp/wclog

######## 警告/提示信息 ########
zx="执行"
logfile="日志文件"
logAnalysis="日志"
logdir="日志目录"
loglist="日志文件列表"

######## input输入提示 ########
input=`echo -e "\033[34m请输入${logAnalysis}查询编号:\033[0m"`
inputcx=`echo -e "\033[34m请输入查询编号: \033[0m"`
inputdir=`echo -e "\033[34m请输入${logdir}名称: \033[0m"`
inputzx=`echo -e "\033[34m请输入${zx}编号: \033[0m"`
inputlogfile=`echo -e "\033[34mq退出 b返回 | 请输入${logfile}编号: \033[0m"`

######## 日志分析函数 ########
function search() {
    PP=$1
    while true
    do
        echo "

        1: 查询当天 [ALL请求ip排行] 统计
        2: 查询当天 [ALL请求ip排行] 前40的统计
        3: 查询当天 [请求ip次数最多的] 页面统计
        4: 查询指定 [时间段ip请求] 排行统计
        5: 查询当天 [ALL请求状态码] 统计
        6: 查询指定 [状态码] 页面请求信息
        7: 查询指定 [ip] ALL请求的页面
        8: 查询指定 [关键词] 有关的记录
        
        b [返回] | q [退出]
        "
    logname=`echo -e "\033[33m($file)\033[0m"`
        read -p "$logname$input" a    
        case $a in
            1)
                echo "------------- 所有请求IP次数统计排序 --------------"
                cat $PP/$file |awk '{print $1}' |sort -n  |uniq -c|sort -n >/tmp/wclog/allip
                pr -w150 -t -6 /tmp/wclog/allip
                echo "当前一共有 `cat $PP/$file |awk '{print $1}' |sort -n  |uniq -c|sort -n|wc -l` 个ip请求"
            ;;
            2)
                echo "------------- 请求次数 IP前40名 --------------"
                cat $PP/$file |awk '{print $1}' |sort -n  |uniq -c|sort -n|tail -n 40 >/tmp/wclog/40ip
                pr -w150 -t -6 /tmp/wclog/40ip
            ;;
            3)
                ip=`cat $PP/$file |awk '{print $1}' |sort -n  |uniq -c|sort -n|tail -n 1 |awk '{print $2}'`
                qd=`echo -e "\033[36m请求ip: \033[0m"`
                sj=`echo -e "\033[36m请求时间: \033[0m"`
                dz=`echo -e "\033[36m请求地址: \033[0m"`
                zt=`echo -e "\033[36m状态码: \033[0m"`
                echo "------------- 请求最多次的IP 所请求的页面统计 --------------"
                awk -v wc="$ip" -v qiuip="$qd" -v shijian="$sj" -v dizhi="$dz" -v zhuang="$zt" '{if($1 == wc) print qiuip$1 "\t"   shijian$4 "\t  "    dizhi$7 "\t"zhuang$9}' $PP/$file
            ;;
            4)
                read -p "请输入开始时间【如08:00输入0800】: " a
                read -p "请输入结束时间【如12:00输入1200】: " b
                cat $PP/$file|awk -F "[-|:| ]+" -v k="$a" -v s="$b" '{if(s >= $3$4 && $3$4 >= k) print $0}' >/tmp/wclog/$a$b.log
                echo "------------- $a-$b 时间段请求IP统计情况 --------------"
                cat /tmp/wclog/$a$b.log |awk '{print $1}' |sort -n  |uniq -c|sort -n
            ;;
            5)
                #赋值
                zt=`echo -e "\033[36m状态码:\033[0m"`
                er=`echo -e "\033[32m200\033[0m"`
                sis=`echo -e "\033[33m403\033[0m"`
                ss=`echo -e "\033[31m404\033[0m"`
                wub=`echo -e "\033[31m500\033[0m"`
                sly=`echo -e "\033[33m301\033[0m"`
                sle=`echo -e "\033[33m302\033[0m"`
                sals=`echo -e "\033[33m304\033[0m"`
                #变量
                ok=`awk '{print $9}' $PP/$file |grep 200 |wc -l`
                sls=`awk '{print $9}' $PP/$file |grep 403 |wc -l`
                slsi=`awk '{print $9}' $PP/$file |grep 404 |wc -l`
                wb=`awk '{print $9}' $PP/$file |grep 500 |wc -l`
                slyi=`awk '{print $9}' $PP/$file |grep 301 |wc -l`
                sler=`awk '{print $9}' $PP/$file |grep 302 |wc -l`
                ssi=`awk '{print $9}' $PP/$file |grep 304 |wc -l`
                #打印格式
                echo "------------- 当天请求 http状态码统计情况 --------------"
                printf "%-10s %-10s %-10s %-10s\n" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                printf "%-20s %-19s %-19s %-18s %-18s %-18s %-18s %-10s\n" $zt $er $sis $ss $wub $sly $sle $sals
                printf "%-10s %-10s %-10s %-10s\n" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                printf "%-10s %-10s %-10s %-9s %-9s %-9s %-9s %-10s\n" 数量: $ok  $sls  $slsi  $wb $slyi $sler $ssi
                printf "%-10s %-10s %-10s %-10s\n" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        
                #echo -e $zt"\t"$er"\t"$sis"\t"$ss"\t"$wub"\t"$sly"\t"$sle"\t"$sals
                #echo -e 数量:"\t"$ok"\t"$sls"\t"$slsi"\t"$wb"\t"$slyi"\t"$sler"\t"$ssi
            ;;
            6)
                read -p "请输入要查询请求记录的状态码:" sta
                echo "------------- 查询指定状态码 所请求的页面统计 --------------"
                echo -e "`cat $PP/$file |awk -v jl=$sta '{if($9 == jl)print $0}'`"  #使用echo -e 是为了转义日志文件中的16进制字符,如果没有可以不用echo -e
            ;;
            7)
                read -p "请输入ip地址:" ip
                echo "------------- 指定ip 所请求页面统计 --------------"
                cat $PP/$file |awk -v sip="$ip" '{if($1 == sip) print $0}'
            ;;
            8)
                read -p "请输入要查询记录包含的相关词:" ci
                echo "------------- 查询包含指定关键词的记录(如果为空则为没有查询到有关记录) --------------"
                echo -e "`grep "$ci" $PP/$file`" #使用echo -e 是为了转义日志文件中的16进制字符,如果没有可以不用echo -e
            ;;
            b)
                break
            ;;
            q)
                exit
            ;;
            *)
                color=`echo -e "\033[31m请输入正确的${logAnalysis}编号\033[0m"`;echo $color
            ;;
        esac
    done
}

######## 查询循环 ########
function xh() {
    ls $1|egrep "log$" >/dev/null
    if [ $? == 0 ];then
        while true
        do
            if [[ $cx == 1 || "$cx" == "" ]];then
            echo "---------- 查询当天 -----------
        1:执行 b:返回 | q:退出"
            elif [ $cx == 2 ];then
            echo "---------- 查询昨天 -----------
        1:执行 b:返回 | q:退出"
            elif [ $cx == 3 ];then
            echo "---------- 查询历史 -----------
        1:执行 b:返回 | q:退出"
        
            fi
        
            read -p "${inputzx}" u
        
            case $u in
                1)
                    echo "-------------${loglist}--------------"
                    logline=`cat /tmp/wclog/listlog |wc -l`
                    ls $1 |grep -v error |tr "\t" "\n" >/tmp/wclog/listlog && cat -n /tmp/wclog/listlog |pr -t -w 180 -5
                    read -p "${inputlogfile}" list
                        case $list in
                        [0-9]*)
                            if [ $list -gt $logline ]
                            then
                                echo -e "\033[31m请输入正确的${logfile}编号 \033[0m"
                                continue
                            else
                                file=`sed -n "$list"p /tmp/wclog/listlog`
                                search "$1"  #函数后跟传参变量
                            fi
                        ;;
                        q)
                            exit
                        ;;
                        b)
                            continue
                        ;;
                        *)
                            echo -e "\033[31m请输入正确的${logfile}编号 \033[0m"
                        ;;
                        esac
                ;;
                b)
                    break
                ;;
                q)
                    exit
                ;;
                *)
                    echo -e "\033[31m请输入正确的${zx}编号 \033[0m"
                ;;
            esac
        done
    else
        echo "日志目录中没有.log结尾的日志文件" && continue
    fi
}

######## 执行脚本 ########
while true
do
    echo "
        1: 查询当天 (回车)
        q: 退出
    "
    read -p "${inputcx}" cx
    case $cx in
        3)
            ## 历史日志 ##
            echo "---------- 历史日志目录列表 -----------"
            cd $logs && ls && ls >/tmp/wclog/dirlist
            read -p  "${inputdir}" dt
            grep -w "$dt" /tmp/wclog/dirlist >/dev/null
            if [ $? == 0 ]
            then
                xh "$logs/$dt"
                
            else
                echo -e "\033[31m目录不存在,请输入正确的${logdir}名称 \033[0m"
            fi
            ;;

        2)
            ## 昨天日志 ##
            xh "$logs/$qian"
        ;;
        q)
            exit
        ;;
    esac    
    
    ## 当天日志 ##
    if [[ "$cx" == "" || "$cx" == "1" ]]
    then
        xh "$daylogs"
    else
        echo -e "\033[31m请输入正确的查询编号: \033[0m"
    fi
done

查询当天日志示例

ng1.png
ng2.png


查询昨天日志示例

ng3-1.png
ng3-2.jpg


查询历史日志示例

ng4.jpg


商业转载请联系作者获得授权,非商业转载请注明出处,谢谢合作。


如果这篇文章帮助到了你,我感到十分荣幸!

或许你不想写点什么·但我依旧在这里

icon_mrgreen.pngicon_neutral.pngicon_twisted.pngicon_arrow.pngicon_eek.pngicon_smile.pngicon_confused.pngicon_cool.pngicon_evil.pngicon_biggrin.pngicon_idea.pngicon_redface.pngicon_razz.pngicon_rolleyes.pngicon_wink.pngicon_cry.pngicon_surprised.pngicon_lol.pngicon_mad.pngicon_sad.pngicon_exclaim.pngicon_question.png2018new_aini_org.png2018new_baobao_thumb.png2018new_erha_org.png2018new_kuxiao_thumb.png2018new_yun_thumb.png2018new_hufen_thumb.png2018new_gui_org.png2018new_xiaoerbuyu_org.png2018new_heixian_thumb.png2018new_wabi_thumb.png2018new_tianping_thumb.png

站点地图 网站地图
豫ICP备17003270号 | Copyright © 2019 💖 靳闯博客
Typecho🍹Sgreen
TOP