要即时分析线上访问商品情况,命中率,缓存,热点商品统计,比如一小时内,数秒内的值,还有一些其它数据指标的分析。这个时候AWK就显得非常强大了。
日志格式:
由Nginx配置
$remote_addr $request_time_usec $http_x_readtime [$time_local] \"$request_methodhttp://$host$request_uri\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" $upstream_response_time $http_ns_client_ip $srcache_cache_status
很久没用awk了,有些生疏,记下此次过程。
1 首先要从一个日志文件获取指定时间以来数据。如何进行日期比较?
主要是取当前系统时间生与一个与日志格式相同的字符串再进行比较,awk 内置 strftime这个函数,可以使用这个函数
2 如何统计商品这段时间访问数?
从访问URL中 抓取特定参数 id 来进行统计,每分析到一条 ids[id]++;
3 如何抓取URL中指定参数?
使用gsub函数,t=gsub(/.*[&|?]id=|[&|"].*/,"",t),t为整个访问的URL
4 如何获取top N?
使用sort将结果排序:for(i in ids){print i,ids[i] | "sort -r -n -k2"}
5 由于中间还夹杂些其它它干扰日志,需要再作些简单的过滤。
最终结果:
完整的热点访问统计:
awk 'BEGIN{sum=0;now=strftime("[%d/%b/%Y:%T",systime())}{if(NF>15 && $4>now){sum++;t=$7;t=gsub(/.*[&|?]id=|[&|"].*/,"",t);ids[t]++;srcache[$NF]++; }}END{ for(i in ids){print i,ids[i] | "sort -r -n -k2"} print "total:" sum}' xxxx-access_log | more
命中率
awk 'BEGIN{sum=0;now=strftime("[%d/%b/%Y:%T",systime())}{if(NF>15 && $4>now){sum++;t=$7;id=gsub(/.*[&|?]id=|[&|"].*/,"",t);ids[t]++;srcache[$NF]++; }}END{ for(i in srcache){print i,srcache[i]} hit=srcache["HIT"]/sum; print "Total:" sum,"Hit rate:"hit}' xxxx-access_log
如需要1小时内的统计: systime()-3600