Chinaunix首页 | 论坛 | 博客
  • 博客访问: 270226
  • 博文数量: 53
  • 博客积分: 2580
  • 博客等级: 少校
  • 技术积分: 509
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-29 10:02
文章分类

全部博文(53)

文章存档

2014年(1)

2013年(1)

2011年(14)

2010年(37)

我的朋友

分类: LINUX

2010-06-22 11:35:09

   还是之前那个需求,我们软件下载量和下载请求的来源,老板要求每天上午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) |
给主人留下些什么吧!~~

chinaunix网友2010-06-28 20:45:45

good!顶!!!