一、概述
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进行排序将查看的ip进行排序:
cat /var/log/nginx/access.log | awk '{print $1}' | sort |uniq -c |sort -rn |more
详细解释:
sort:排序
-c:把相同的ip取出来
-rn:反序排序
输出状态码输出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
输出时候结果为:
结果展示
网友评论