Linux学习|Gentoo/Arch/FreeBSDLinuxLinux学习之路

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

2020-02-14  本文已影响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

添加到脚本中

输出时候结果为:

结果展示
上一篇下一篇

猜你喜欢

热点阅读