美文网首页Linux学习|Gentoo/Arch/FreeBSDLinuxLinux学习之路
shell场景脚本实战四(日志分析控制脚本)

shell场景脚本实战四(日志分析控制脚本)

作者: 李菜菜同学 | 来源:发表于2020-02-14 19:16 被阅读0次

    一、概述

    1.脚本:check_http_log.sh

    常见的系统日志文件

    log_format介绍:

    cat /etc/nginx/nginx.conf | grep -A 2 log_format

    介绍

    log_format:日志输出的自定义的内容

    remote_addr:自定义输出的变量,这里代表的IP

    time_local:当前本地的访问时间及请求的时间

    request:访问的url是Get请求,后面加上访问地址

    status:访问状态

    body_bytes_sent:发给客户端的大小字节数

    http_referer:请求上一级的页面的地址

    http_user_agent:http浏览器的头,ios、安卓等,不同浏览器有不同的头

    http_x_forwarded_for:http的头,记录客户端地址的。

    2.http状态码介绍

    Http状态码的介绍

    二、日志分析

    1.应用日志分析脚本实现准备

    实现功能介绍:

    1.分析HTTP状态码在100-200、200-300、300-400、400-500、500以上,5个区间的请求条数。

    2.分析日志HTTP状态码为404、500的请求数

    对日志进行分析:

    我的日志中的内容:(内容是随便编写的)

    查看日志中的内容 :

    cat /var/log/nginx/access.log

    查看日志中的内容

    查看日志第一列的内容

    cat /var/log/nginx/access.log | awk '{print $1}'

    查看日志第一列的内容

    将查看的ip进行排序:

    cat /var/log/nginx/access.log | awk '{print $1}' | sort  |uniq -c  |sort -rn  |more

    详细解释:

    sort:排序

    -c:把相同的ip取出来

    -rn:反序排序

    将查看的ip进行排序

    输出http状态码:(数一下你的http状态码在第几列输出即可,)

    cat /var/log/nginx/access.log | awk '{print $11}' 

    输出状态码

    注意:有的时候,自定义的状态码,每一条是参差不齐的,有可能有的在一列,有可能不在一列,所以需要进行处理。

    为了演示这种情况将使用 access.log-20200211日志继续。

    查看

    输出Http的协议及状态码:

    cat /var/log/nginx/access.log-20200211 | grep -ioE "HTTP\/1\.[1|0]\"[[:blank:]] [0-9]{3}"

    详细解释:

    i:不区分大小写

    o:精确的输出

    E:正则,支持元字符

    [[:blank:] :空格

    [0-9]{3} :输出三位数的数字

    图示

    2.HTTP状态码不同区间的请求条数

    函数 Check_http_status脚本内容:

     resettem=$(tput sgr0)

      Logfile_path='/var/log/nginx/access.log-20200211'

     Check_http_status()

     {

    Http_statu_codes=(`cat $Logfile_path | grep -ioE "HTTP\/1\.[1|0]\"[[:blank:]] [0-9]{3}"|awk -F"[ ]+" '{   //awk状态划分,awk后面匹配一个空格

             if($2>=100&&$2<200)

             {i++}

             else if($2 >= 200 && $2 < 300)

                     {j++}

             else if($2>=300&&$2<400)

                     {k++}

             else if($2>=400&&$2<500)

                     {n++}

             else if($2>=500)

                    {p++}

             }END{

     print i?i:0,j?j:0,k?k:0,n?n:0,p?p:0,i+j+k+n+p

     }'

     `)

     echo -e '\E[35m'"The number of http status[100+] :" ${resettem} ${Http_statu_codes[0]}

     echo -e '\E[35m'"The number of http status[200+] :" ${resettem} ${Http_statu_codes[1]}

     echo -e '\E[35m'"The number of http status[300+] :" ${resettem} ${Http_statu_codes[2]}

     echo -e '\E[35m'"The number of http status[400+] :" ${resettem} ${Http_statu_codes[3]}

     echo -e '\E[35m'"The number of http status[500+] :" ${resettem} ${Http_statu_codes[4]}

     echo -e '\E[35m'"All request numbers :" ${resettem} ${Http_statu_codes[5]}

    }

    Check_http_status

    注意:数组是从0开始的。

    执行结果

    3.HTTP状态码在404和500区间的请求条数

    函数 Check_http_code脚本内容:

    Check_http_code()

      {

      Http_code=(`cat $Logfile_path | grep -ioE "HTTP\/1\.[1|0]\"[[:blank:]] [0-9]{3}"|awk -v total=0 -F"[ ]+" '{  //-v变量设置total设为0;

            if($2!="")  //如果它的第二列不等于空

              {code[$2]++;total++}  //就进行数量的增加,总量的加加

            else

              {exit}

              }END{

     print code[404]?code[404]:0,code[403]?code[403]:0,total  //输出关联数组的内容,查询404/403数量的输出,如果有输出404/403的数量,如果没有则输出0。输出总的值

       }'

       `)

     echo -e '\E[35m'"The number of http status[404] :" ${resettem} ${Http_code[0]}

     echo -e '\E[35m'"The number of http status[403] :" ${resettem} ${Http_code[1]}

     echo -e '\E[35m'"All request number :" ${resettem} ${Http_code[2]}

            }

    Check_http_code

    图示

    三、添加注释

    在主控shell脚本里面添加下列即可。

    grep - E "^\#Program function" ${script_file} //找出开头是#Program function的一行输出

    然后在需要加上注释的脚本加上即可。

    例子:此脚本(check_http_log.sh)加上

    #Program function :Nginx's log analysis

    添加到脚本中

    输出时候结果为:

    结果展示

    相关文章

      网友评论

        本文标题:shell场景脚本实战四(日志分析控制脚本)

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