定制化过的nginx日志格式
^A 是内部自定义日志格式是加的隔离符号,Ctrl+V Ctrl+A,必须手动敲,复制无效
#nginx日志定义格式
log_format main '$time_local ^A $remote_addr ^A $request_method '
^A '$request_uri ^A $uri ^A $request_time '
^A '$status ^A $body_bytes_sent '
^A '$geoip2_data_country_name ^A $geoip2_data_subdivisions_name ^A $geoip2_data_city_name '
^A '$http_referer ^A $upstream_addr ^A $upstream_response_time '
^A '$http_user_agent ^A $http_x_forwarded_for';
$time_local:
本地时间
$remote_addr:
请求客户端IP地址
$request_method:
请求方法
$request_uri:
请求的URL,不带有请求的参数
$uri:
请求的URL,带有请求的参数
$request_time:
请求处理时间,即响应时间
$status:
返回状态
$body_bytes_sent:
发送body大小
$geoip2_data_country_name:
请求所属的国家
$geoip2_data_subdivisions_name:
请求所属的省份或地区
$geoip2_data_city_name:
请求所属的城市
$http_referer:
请求来自于何处,例如从百度跳转过来
$upstream_addr:
请求转发的后端服务器地址
$upstream_response_time:
后端服务器响应的时间
$http_user_agent:
访问客户端信息,可以获取到请求浏览器版本信息等
$http_x_forwarded_for:
请求经过的代理信息
日志
29/Nov/2018:16:56:36 +0800 59.83.198.149 POST /frame9_v7/listallmessagebytype_v7 /frame9_v7/listallmessagebytype_v7 0.010 200 1181 China Shandong Jinan - 192.168.0.58:8000 0.010 okhttp/3.10.0 - 147- - -
nginx日志分析
统计日志中访问最多的10个IP
思路:对IP列去重,并输出出现的次数
方法一:
cat access.log | awk -F'^A' '{a[$2]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}'
方法二:
cat access.log | awk -F'^A' '{ print $2 }' |sort |uniq -c |sort -k1 -nr |head -n10
## ^A 是公司内部自定义日志格式是加的隔离符号,Ctrl+V Ctrl+A,必须手动敲,复制无效
统计日志中访问大于500次的IP
方法一:
cat access.log | awk -F'^A' '{a[$2]++}END{for(i in a){if(a[i]>500)print i,a[i]}}' access.log
方法二:
cat access.log | awk -F'^A' '{a[$2]++;if(a[$2]>500){b[$2]++}}END{for(i in b){print i,a[i]}}' access.log
统计2018年11月29日一天内访问你最多的10个IP
思路:先过滤出这个时间段的日志,然后去重,统计出现次数
方法一:
cat access.log |awk -F'^A' '$1>="29/Nov/2018:00:00:01" && $1<="29/Nov/2018:23:59:59" {a[$1]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}'
方法二:
#前提开始时间与结束时间日志中必须存在
sed -n '/29\/Nov\/2018:00:00:01/,/29\/Nov\/2018:23:59:59/p' access.log |sort |uniq -c |sort -k1 -nr |head -n10
统计当前时间前一分钟的访问数
思路:先获取当前时间前一分钟对应日志格式的时间,再匹配统计
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
统计访问最多的前10个页面
cat access.log | awk -F'^A' '{a[$4]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}'
统计每个URL访问内容的总大小($body_bytes_sent)
cat access.log | awk -F'^A' '{a[$8]++;size[$8]+=$10}END{for(i in a)print a[i],size[i],i}'
统计每个IP访问状态数量($status)
cat access.log | awk -F'^A' '{a[$1" "$9]++}END{for(i in a)print i,a[i]}'
统计访问状态为404的IP及出现次数
cat access.log | awk -F'^A' '{if($9~/404/)a[$1" "$9]++}END{for(i in a)print i,a[i]}'
原生nginx日志
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
192.168.149.9 - - [29/Nov/2018:02:00:22 -0500] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" "-"
提取总记录数
思路:拆分原始文件,找到状态列,按照不同条件值,分别获取总数
cat access.log | awk '{if($8>0) print $9}' | wc -l | awk '{print "Total Items:"$1}'
#Total Items:447
统计200成功总数
cat access.log | awk '{if($9==200) print $9}' | wc -l | awk '{print "Total Items:"$1}'
#Total Items:400
统计404失败总数
cat access.log | awk '{if($9==404) print $9}' | wc -l | awk '{print "Total Items:"$1}'
#Total Items:4
统计403失败总数
统计500失败总数
错误中,哪类URL出现次数最多,并提出重复项
思路:拆分获取request和status,对request拆分获取真实url,对url排序、去重、计算总数、倒叙排列
cat access.log | awk '{if ($9==200) print $7}' | sort | uniq -c | sort -nr -k1 |head -n10