针对nginx请求日志,分析其中 ip,http协议版本,post/get,响应状态 除了200之外的所有状态
grep结合awk处理访问日志、访问ip统计(通过接口ip反查区域,分析出某个区域的用户对微商城关注情况)、不同业务访问日志(分析哪些业务是用户关注的)、微信通知交易日志(在数据库统计错误的情况下,通过微信推送的交易日志来处理,当然这种情况下有可能不准,因为微信通知我们开发者服务器,开发者服务器也要回微信success,如果此时开发者服务器异常没有及时回微信或者回微信了,但是微信没有收到,这种情况下微信会重复推送的,所以此种情况不做精确匹配,一个补尝的方案的,拿到微信的推送结果,解析xmltostruct,to db,之后去重。)
日志
1、业务相关的,也就是具体不同功能页面对应的【url地址】
比如发起支付请求
比如浏览首页、分类页、详情页、购物车页、推荐页、等等吧,有利于公司的大数据部分进行产品的精准营销
2、业务外围的,比如下单相关的微信支付支付成功之后的推送,或者是支付成功之后的短信通知,邮件通知等【具体在程序中也是对应的url地址】
nginx日志格式
log_format main '$remote_addr | $remote_user | "$request" | $status | $body_bytes_sent | $request_body "$http_referer" | "$http_user_agent"|';
nginx日志内容
27.187.116.223 | - | "GET /Api/callback HTTP/1.1" | 200 | 109 | <xml><appid><![CDATA[wx6cd93ed0194fae7f]]></appid><bank_type><![CDATA[CFT]]></bank_type><cash_fee><![CDATA[1]]></cash_fee><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[N]]></is_subscribe><mch_id><![CDATA[1483469312]]></mch_id><nonce_str><![CDATA[1572760465986496000]]></nonce_str><openid><![CDATA[oR3eB4hDIXDypm-TMVR5bY0uzpfI]]></openid><out_trade_no><![CDATA[111111111220002]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[8FB363C83CD596012B2AEA0E3E8EF623]]></sign><time_end><![CDATA[20191103135437]]></time_end><total_fee>1</total_fee><trade_type><![CDATA[JSAPI]]></trade_type><transaction_id><![CDATA[4200000407201911032614813137]]></transaction_id></xml> "-" | "PostmanRuntime/7.26.5"|
针对nginx请求日志,分析其中 ip,http协议版本,post/get,响应状态 状态码
查找日志中包含给定内容
grep -ioE "\"(POST|GET)[[:blank:]](\S)+[[:blank:]]HTTP\/1\.[1|0]\"[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+(\S)+" miniprograme.onajax.com.log
grep -iE "\"(POST|GET)[[:blank:]](\S)+[[:blank:]]HTTP\/1\.[1|0]\"[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+(\S)+" miniprograme.onajax.com.log
grep
-i 忽略PATTERN中的大小写,也忽略输入文件中的大小写区别
-o 输出被匹配到的字符串,而不是输出整行。每个被匹配到的字符串都使用单独的行输出。
-e 明确指定使用此处的PATTERN作为待匹配的pattern。该选项可以指定多次,它可以保护以"-"开头的pattern。('-e'是POSIX指定的选项。)
统计日志,记录行数及各个域
grep -iE "\"(POST|GET)[[:blank:]](\S)+[[:blank:]]HTTP\/1\.[1|0]\"[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+(\S)+" miniprograme.onajax.com.log | awk -F " " 'BEGIN{i=0;print "[start]统计行数开始:"}{i++;print $1,$5,$7,$9,$11,$14}END{print "总行数:",i}'
-----awk读取流程-----
读取文件第一行(awk默认按行读取文件)
将所读取的行赋值给awk的变量$0,于是$0中保存的就是本次所读取的行数据
进入代码块{print $0}并执行其中代码print $0,即输出$0,也即输出当前所读取的行
执行完本次代码之后,进入下一轮awk循环:继续读取下一行(第二行)
将第二行赋值给变量$0
进入代码块执行print $0
执行完代码块后再次进入下一轮awk循环,即读取第三行,然后赋值给$0,再执行代码块
…不断循环,直到读完文件所有数据…
退出awk
按照ip地址排序,由于 ip地址是字符串,所以 n可以不指定
grep -iE "\"(POST|GET)[[:blank:]](\S)+[[:blank:]]HTTP\/1\.[1|0]\"[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+(\S)+" miniprograme.onajax.com.log | awk -F " " 'BEGIN{i=0;}{print $1,$5,$6,$7,$9,$11}END{print "ok"}' | sort -k1n
统计Ip出现的次数,并按访问次数降序
grep -iE "\"(POST|GET)[[:blank:]](\S)+[[:blank:]]HTTP\/1\.[1|0]\"[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+(\S)+" miniprograme.onajax.com.log | awk -F " " '{arr[$1]++}END{for(i in arr){print i,arr[i]}}' | sort -k2nr
统计Ip出现的次数 并统计记录数
grep -iE "\"(POST|GET)[[:blank:]](\S)+[[:blank:]]HTTP\/1\.[1|0]\"[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+(\S)+" miniprograme.onajax.com.log | awk -F " " 'BEGIN{record=0;print "[start]i=0;"}{arr[$1]++;record++}END{for(i in arr){print i,arr[i]} print "总记录:",record}'
统计Ip出现的次数,并按访问次数降序,显示前15行
grep -iE "\"(POST|GET)[[:blank:]](\S)+[[:blank:]]HTTP\/1\.[1|0]\"[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+(\S)+" miniprograme.onajax.com.log | awk -F " " '{arr[$1]++}END{for(i in arr){print i,arr[i]}}' | sort -k2nr | head -n 15
日志大类
1、业务相关的,也就是具体不同功能页面对应的【url地址】
比如发起支付请求
比如浏览首页、分类页、详情页、购物车页、推荐页、等等吧,有利于公司的大数据部门进行产品的精准营销
2、业务外围的,比如下单相关的微信支付支付成功之后的推送,或者是支付成功之后的短信通知,邮件通知等【具体在程序中也是对应的url地址】
统计url【url可以定位不同的页面功能】访问的次数 并统计记录数
grep -iE "\"(POST|GET)[[:blank:]](\S)+[[:blank:]]HTTP\/1\.[1|0]\"[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+(\S)+" miniprograme.onajax.com.log | awk -F " " 'BEGIN{record=0;print "[start]i=0;"}{arr[$6]++;record++}END{for(i in arr){print i,arr[i]} print "总记录:",record}'
限定日志的内容为【微信支付通知的数据】
grep -iE "\"(POST|GET)[[:blank:]](\S)+[[:blank:]]HTTP\/1\.[1|0]\"[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+(<xml><appid>\S)+" miniprograme.onajax.com.log | awk -F " " 'BEGIN{i=0;print "[start]统计行数开始:"}{i++;print $1,$5,$7,$9,$11,$13}END{print "总行数:",i}'
grep -iE "\"(POST|GET)[[:blank:]](\S)+[[:blank:]]HTTP\/1\.[1|0]\"[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+[[:digit:]]+[[:blank:]]+\|[[:blank:]]+(<xml><appid>\S)+" miniprograme.onajax.com.log | awk -F " " 'BEGIN{i=0;}{i++;print $1,$5,$7,$9,$11,$13}END{}'