全栈编程

Balance $ 2,317
Item Sold 1230
文章作者: 全栈编程@luboke.com
版权声明: 本文章为全栈编程go语言体系课视频教程配套电子书,版权归 全栈编程@luboke.com所有,欢迎免费学习,转载必须注明出处!但禁止任何商业用途,否则将受到法律制裁!

针对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{}'

文章作者: 全栈编程@luboke.com
版权声明: 本文章为全栈编程go语言体系课视频教程配套电子书,版权归 全栈编程@luboke.com所有,欢迎免费学习,转载必须注明出处!但禁止任何商业用途,否则将受到法律制裁!
copyright © 2020 全栈编程@luboke.com