还是之前那个需求,我们软件下载量和下载请求的来源,老板要求每天上午10点钱都要看到结果。
我们有一个域名,采用DNS轮询的方式对应数台服务器,有下载请求就会有这几台服务器把请求转发到其他的大量下载机器上。要统计下载量和下载请求的来源,只需要把这个域名对应的几台服务器的nginx日志做分析,然后结果汇总就可以了。
还有个比较麻烦的问题,当用户请求下载会有以下几种情况:
1、多线程工具的下载,如firefox下面的DownThemAll启动了4个线程进行下载,下载地址是跳转后的,这种现在只会向这几台服务器中一台请求一次,但会向下载服务器请求多次。
2、迅雷等这种p2p下载工具,会向这个域名请求多次,向下载服务器请求多次
3、3.IE内置的下载这种,只会向该域名请求一次,向下载服务器请求多次
这样会导致统计数据会比实际下载量高出很多,经过测试,发现这种多次请求基本都会集中在1分钟之内,可以过滤掉。
于是,我在那几台服务器的上部署了一个分析脚本,用crond跑,对日志做初步的过滤,然后通过ftp上传到一台分析服务器上。
nginx日志格式如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for $upstream_response_time $upstream_addr $upstream_status ';
|
分析脚本如下:
#!/bin/bash #logAnaagent.sh #version 1.0 #update 20100622 BY Serwei Xu #Author: Serwei Xu(xw2014@sina.com) sysdate=`date +'%Y%m%d'` testdate=`date -d "1 days ago" +%Y%m%d` awk '{if($NF=="302"&&$7=="/self.exe")print$1$4":"$11}' /home/test/logs/nginx/access.log-$sysdate|sed 's/\[/\:/g' |awk -F : '{print$1"|"$3":"$4"|"$NF}'|sed 's/"\|-//g'|awk -F \/ '{print$1$3}'|awk -F \| '{if($3!="")print$0}'> /home/test/logs/logAna/99logAna-$sysdate.log /usr/bin/lftp -u 'test,123456' 192.168.3.5 << EOF cd logAna put /home/test/logs/logAna/99logAna-$sysdate.log bye EOF
|
日志分析服务器上有个脚本对上传的日志做2次分析,得到结果然后邮件给老板。脚本如下:
#!/bin/bash #agentAna.sh #version 1.2 #update 20100622 BY Serwei Xu #Author: Serwei Xu(xw2014@sina.com)
sysdate=`date +'%Y%m%d'` testdate=`date -d "1 days ago" +%Y%m%d` logcount=`ls -l /home/web/logAna/*logAna-$sysdate.log|wc -l` if [ "$logcount" != 4 ];then echo " $testdate " echo "========================================" >/home/web/logAna/logAna-report$sysdate.log echo "self.exe download source">>/home/web/logAna/logAna-report$sysdate.log echo "========================================">>/home/web/logAna/logAna-report$sysdate.log echo "have no all of result,please check it! ">/home/web/logAna/logAna-report$sysdate.log else cat /home/web/logAna/99logAna-$sysdate.log >/home/web/logAna/logAna-$sysdate.log cat /home/web/logAna/87logAna-$sysdate.log >>/home/web/logAna/logAna-$sysdate.log cat /home/web/logAna/138logAna-$sysdate.log >>/home/web/logAna/logAna-$sysdate.log cat /home/web/logAna/139logAna-$sysdate.log >>/home/web/logAna/logAna-$sysdate.log echo "========================================" >/home/web/logAna/logAna-report$sysdate.log echo "self.exe download source">>/home/web/logAna/logAna-report$sysdate.log echo "========================================">>/home/web/logAna/logAna-report$sysdate.log echo "date: $testdate Total count :`cat /home/web/logAna/logAna-$sysdate.log|sort|uniq|wc -l` " >>/home/web/logAna/logAna-report$sysdate.log echo "">>/home/web/logAna/logAna-report$sysdate.log echo " count source (only top 30) ">>/home/web/logAna/logAna-report$sysdate.log cat /home/web/logAna/logAna-$sysdate.log|sort|uniq|awk -F \| '{print$3}'|sort|grep -v '^$'|uniq -c|sort -rn|head -30 >>/home/web/logAna/logAna-report$sysdate.log fi
/usr/bin/perl /home/test/tools/sendEmail.pl -f "xw2014@sina.com" -t -s mail.sina.com -xu -xp 123456 -u "self.exe download report $testdate" -m "`cat /home/web/logAna/logAna-report$sysdate.log`"
|
发生邮件用的perl脚本如下:详细参数请查看help
|
文件: |
sendEmail.tar.gz |
大小: |
19KB |
下载: |
下载 | |
其实还可以写成xml文件,然后用web的方式调用,或者写到数据库中,web调用,用画图工具得出图表。方法多多。
阅读(1828) | 评论(1) | 转发(0) |