统计log中的数据

日志格式(log)(使用的log4j记录的日志,分隔符使用的是一个tab,注意日期的时间与小时那里是一个空格,第一列为时间;第二列为id,为某一个唯一标识,第三列为ip,第四列后面的可以不用考虑):

2009-04-05 12:00:02 0572 218.200.247.111
2009-04-05 12:00:02 0571 218.207.218.135
2009-04-05 12:00:02 0571 218.205.237.10
2009-04-05 12:00:03 1213 211.139.190.234
2009-04-05 12:00:03 0161 218.207.91.131
2009-04-05 12:00:03 0162 211.138.45.11
2009-04-05 12:00:03 1170 211.96.28.105 DYSM-F420M01/(2006.11.09)N.RF4200111.M01001.V1.0/WAP2.0 Profile/MIDP-2.0 Configuration/CLDC-1.0
2009-04-05 12:00:03 0182 211.138.237.173
2009-04-05 12:00:03 0161 218.207.91.131
2009-04-05 12:00:04 0779 211.143.171.143
2009-04-05 12:00:04 0981 211.94.164.215 NOKIA5700
2009-04-05 12:00:04 1190 211.136.222.98
2009-04-05 12:00:05 0161 211.136.222.98
2009-04-05 12:00:06 0162 211.139.144.74
2009-04-05 12:00:06 0188 211.139.60.19 TIANYU-KTOUCH/D171/Screen-128x160
2009-04-05 12:00:07 0188 211.143.171.143

现在的需求如下:需要得到这个日志里面的某个id,某个ip的量。
目前知道的有两种方法:
1.把这个日志存入数据库中,在mysql下使用/usr/local/mysql/bin/mysql -uroot -proot databasename -e "LOAD DATA LOCAL INFILE '$filename' into table log(visittime,id,ip,*)",sqlserver里也有从文本文件直接导入到数据库的sql语句,oracle应该也有;到了数据库之后通过存储过程获取各种需要的数据。
2.把这个日志直接通过脚本(如awk,shell,sed,python等)处理成需要的数据后再把这些数据插入到数据库中。
这两种方法都各有所长吧,第一种方法比较简单,只需掌握sql知识就行,调试、查错也比较方便。当数据量小时可以使用这种办法,当数据量大的时候数据库操作可能会成为一个瓶颈,比如当一天的数据量达到几千万的时候,把这些数据插入到数据库中需要一点时间,建立一个索引可能就需要半个小时左右的时间,执行一个sql语句基本会在1分钟以上,如果业务逻辑比较复杂,可能还需要5-6分钟,要是条件比较多的话运行速度就会很慢了。目前知道的一些解决办法:分表,分时;分表能够降低一个表里的数据量,相应的时间也会减少;分时基本上是把总的执行时间分配到了每一个小时,这样在第二天则只需执行最后一个小时的日志就行了,提高了机器的使用效率。
第二种方法运行效率上来说比第一种要快很多,一级统计在脚本里做,不需要入库,见索引等操作,数据库的压力会比较小。但这种方法不太方便调试以及查错。当执行时间也要花很久时也可以进行分时的操作。
还有最重要的一点是第一种方法可以很灵活,当需要什么数据的时候可以很快就能得到想要的东西;而第二种则需要改动的地方比较多,脚本,数据库,所有的东西都得改。
因此第一种方法适用于需求经常变动的地方,而第二种则适用于比较稳定的地方。
当然得自己去权衡到底是使用哪种办法更好,印证了那句俗话没有最好的,只有合适的。

下面介绍一下第二种方法

使用awk进行统计数据,如下(load_log.awk):

BEGIN{
#分隔符
FS="\t"
}
{
key=$2+$3;
if(key in cl){
cl[key]++
}else{
cl[key]=1
#日期
stat_date[key]=substr($1,1,10)
#小时
stat_hour[key]=substr($1,12,2)
id[key]=$2
ip[key]=$3
}
}
END{
for(key in cl){
print stat_date[key],stat_hour[key],id[key],ip[key],cl[key]
}
}

这里可以满足最初的那个需求,既得到这个日志里面的某个id,某个ip的量。
在shell中使用awk -f load_log.awk log>temp.log即可。
最后就只需把temp.log文件导入到数据库中就大功告成了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值