Nginx-日志分析
Posted superzwb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx-日志分析相关的知识,希望对你有一定的参考价值。
##日志格式
‘$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"‘
首先把字段解释一下:
remote_addr:客户端地址
remote_user:客户端用户名
time_local:服务器时间
request:请求内功(包括方法名,地址,http协议)
http_host:用户请求时使用的http地址
status:返回的http状态码
request_length:请求大小
body_bytes_sent:返回的大小
http_referrer:来源页
http_user_agent:客户端名称
request_time:整体请求延时
1)统计日志中访问最多的10个IP
思路:因为remote_addr代表的客户端ip,所以取第一列就好了,并且去重,输出次数就ok了
方法1:awk ‘{a[$1]++}END{for(i in a) print a[i],i| "sort -k1 -nr|head -n10"}‘ access.log
解释一下:
说明:a[$1]++ 创建数组a,以第一列作为下标,使用运算符++作为数组元素,元素初始值为0。处理一个IP时,下标是IP,元素加1,处理第二个IP时,下标是IP,元素加1,如果这个IP已经存在,则元素再加1,也就是这个IP出现了两次,元素结果是2,以此类推。因此可以实现去重,统计出现次数,
sort #排序
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思
head #
-q 隐藏文件名
-v 显示文件名
-c<字节> 显示字节数
-n<行数> 显示的行数
方法二:
awk ‘{print $1}‘ access.log |sort|uniq -c |sort -k1 -nr|head -n10
uniq 命令用于报告或忽略文件中的重复行,一般与sort命令结合使用
-c或——count:在每列旁边显示该行重复出现的次数;
-d或–repeated:仅显示重复出现的行列;
-f<栏位>或–skip-fields=<栏位>:忽略比较指定的栏位;
-s<字符位置>或–skip-chars=<字符位置>:忽略比较指定的字符;
-u或——unique:仅显示出一次的行列;
-w<字符位置>或–check-chars=<字符位置>:指定要比较的字符
2)统计日志中访问大于10次的IP
方法1:$ awk ‘{a[$1]++}END{for(i in a){if(a[i]>10)print i,a[i]}}‘ access.log
方法2:$ awk ‘{a[$1]++;if(a[$1]>10){b[$1]++}}END{for(i in b){print i,a[i]}}‘ access.log
说明:方法1是将结果保存a数组后,输出时判断符合要求的IP。方法2是将结果保存a数组时,并判断符合要求的IP放到b数组,最后打印b数组的IP
那大于100次呢,会了吧~~~~
3. 统计2016年4月9日一天内访问最多的10个IP
思路:先过滤出这个时间段的日志,然后去重,统计出现次数
方法1:$ awk ‘$4>="[9/Apr/2016:00:00:01" && $4<="[9/Apr/2016:23:59:59" {a[$1]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}‘ access.log
方法2:$ sed -n ‘/[9/Apr/2016:00:00:01/,/[9/Apr/2016:23:59:59/p‘ access.log |sort |uniq -c |sort -k1 -nr |head -n10 #前提开始时间与结束时间日志中必须存在
4)统计当前时间前一分钟的访问数
思路:先获取当前时间前一分钟对应日志格式的时间,再匹配统计
$ date=$(date -d ‘-1 minute‘ +%d/%b/%Y:%H:%M);awk -vdate=$date ‘$0~date{c++}END{print c}‘ access.log
$ date=$(date -d ‘-1 minute‘ +%d/%b/%Y:%H:%M);awk -vdate=$date ‘$4>="["date":00" && $4<="["date":59"{c++}END{print c}‘ access.log
$ grep -c $(date -d ‘-1 minute‘ +%d/%b/%Y:%H:%M) access.log
说明:date +%d/%b/%Y:%H:%M --> 09/Apr/2016:01:55
5)统计访问最多的前10个页面($request)
awk ‘{a[$7]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}‘ access.log
6)统计每个URL访问内容的总大小($body_bytes_sent)
$ awk ‘{a[$7]++;size[$7]+=$10}END{for(i in a)print a[i],size[i],i}‘ access.log
7)统计每个IP访问状态码数量($status)
$ awk ‘{a[$1" "$9]++}END{for(i in a)print i,a[i]}‘ access.log
8)统计访问状态码为404的IP及出现次数
$ awk ‘{if($9~/404/)a[$1" "$9]++}END{for(i in a)print i,a[i]}‘ access.log
以上是关于Nginx-日志分析的主要内容,如果未能解决你的问题,请参考以下文章