通过awk对日志文件每天统计并入库到MySQL的过程讲解

来源:互联网 发布:mac下面的图标太多 编辑:程序博客网 时间:2024/05/21 22:24

互联网公司每天都要统计日志文件,从中挖掘出想要的信息,比如一个软件的安装量、活跃度等。这些信息都需要入库,并进行展示。下面,对这个实现过程进行讲解。

具体的过程可分为以下几个步骤:

(1)awk统计日志文件,并将统计结果拼接成sql语句;

(2)写shell脚本,将这些sql语句入库;

(3)将shell脚本加入linux中的计划任务中,让其每天凌晨定时执行,从而实现每天自动分析日志并入库;

下面分步骤进行讲解。

一. awk统计日志文件,并拼接成sql语句

awk是对日志文件分析的一个有效命令,下面通过统计日志,计算出活跃用户数、活跃安装id、用户在线时长、一日留存率、和两日留存率。其中一日留存率表示昨天日志中的用户仍然出现在今天的日志中。其中两日留存率表示两天前日志中的用户仍然出现在今天的日志中,即两天前的用户今天仍然使用了该软件。

日志的格式如下:

时间 ip 版本 用户行为 安装序列号 用户id 安装渠道 所安装在的操作系统 在软件上操作的区域 在操作区域上的动作

下面给出几行日志数据示例:

23:55:00    211.11.21.81    1.0.0    getActiveUser    00-00-00-00-00-00-01    000000001    web    Windows XP    
23:55:05    221.21.31.91   2.0.1   sendMsgClient    00-00-00-00-00-00-02    100000000    web    Windows XP    
23:55:05    231.31.41.98   2.0.5   uploadPPimlog    00-00-00-00-00-00-03    000000020    web    Windows 7    main    recent

下面是awk命令对上述日志文件的统计,统计的结果会输出为sql语句。文件命名为PP_sql.sh

#!/bin/shyesterday=`date -d "-1 day" +%Y-%m-%d` if [ "$1" != "" ]; thenlogfile=$1elselogfile="/data/PP-log/*PPIm.access.log.$yesterday"figawk -F"\t" '#function getTitle(name){#if(name == "main_user") return "我的用户";#else return "其他";#}($3 ~ /^[0-9]+\.[0-9]+\.[0-9]+$/){ #过滤脏数据if($4 == "getActiveUser"){#活跃用户数统计user[$3"_"$6] ++;#活跃安装id统计install[$3"_"$5] ++;}else if($9 == "onlineTime"){#用户在线时长统计tmp = ($11 - $10)/1000;if(tmp > 0 && tmp < 86400){onlineCount[$3] ++;onlineTime[$3] += tmp;}}}END{for(k in user){split(k, arr, "_");userOnly[arr[1]] ++;}for(k in install){split(k, arr, "_");installOnly[arr[1]] ++;}#活跃数统计:版本,用户活跃,安装活跃 for(k in userOnly){if(k != "total")print "insert into danalysis(analysisdate,version,useractive,installactive) values(\047'$yesterday'\047,\047"k"\047,"userOnly[k]","installOnly[k]")";}#在线时长统计:版本,平均在线时长(s) for(k in onlineTime){print "update danalysis set avgonlinetime="onlineTime[k]/onlineCount[k]" where analysisdate=\047'$yesterday'\047 and version=\047"k"\047";}}' $logfile#一日留存率和两日留存率统计oneday=`date -d "-2 day" "+%Y-%m-%d"`twoday=`date -d "-3 day" "+%Y-%m-%d"`onelogfile="/data/PP-log/*PPIm.access.log.$oneday"twologfile="/data/PP-log/*PPIm.access.log.$twoday"awk -F"\t" 'BEGIN{d=0;}($3 ~ /^[0-9]+\.[0-9]+\.[0-9]+$/){ #过滤脏数据split(FILENAME, date, "."); #获取文件名上的日期,其中FILENAME表示当前读取的文件名len = length(date);if(d == 0 || two[0] == date[len]){ #统计两日前的日志(twologfile)two[0] = date[len];d = 1;two[$3"_"$6] ++;}else if(d == 1 || one[0] == date[len]){ #统计一日前的日志(onelogfile)d = 2;one[0] = date[len];one[$3"_"$6] ++;}else{ #统计当日的日志(logfile)thisday[$6] ++;}}END{delete two[0];delete one[0];for(k in two){split(k, arr, "_");total[arr[1]] ++;t[arr[1]] ++;if(arr[2] in thisday) remain[arr[1]] ++;}for(k in one){split(k, arr, "_");if(arr[2] in thisday) remain2[arr[1]] ++;total2[arr[1]] ++;t[arr[1]] ++;}#留存率统计:版本,一日留存,两日留存for(k in t){onerate = "-";tworate = "-"if(k in total2) onerate=remain2[k]/total2[k];if(k in total) tworate=remain[k]/total[k];print "update danalysis set onedayexist="onerate",twodayexist="tworate" where analysisdate=\047'$yesterday'\047 and version=\047"k"\047";} }' $twologfile $onelogfile $logfile
注:\047是单引号的表示。第二个awk读取的是多个文件,当读取多个文件时会顺序读取每个文件,对当前文件处理完所有行后再处理下个文件。

二. 通过shell脚本将sql语句入库

上面我们通过了awk实现了日志文件的统计结果转化成sql语句,下面我们只需要将读取这些sql语句,并将他们执行即可,这样统计结果自然就录入到数据库中了。入库的shell命令如下所示:

mysql -u$user -p$pass -D $db -e “insert into t_table values(xxx,xxx,xxx);”

具体的shell:PP_insert_db.sh,如下:

#!/bin/sh/bin/sh /home/lincheung/PP_sql.sh | while read linedo   #echo $line;  mysql -h192.168.111.111 -umysqlroot -p123456 -D mysqldb -e "$line" --default-character-set=utf8done
参考链接:http://blog.csdn.net/jiedushi/article/details/6448740

这里sql语句入库是从入到主库中,当执行这些insert语句时,读取分离代理器会判断这些sql操作是写数据库操作,会将其写到数据库的主库中。但是,当用户请求读取数据库时,也即select操作,读取分离代理器会判断出select是读操作,会将用户请求转移到从库中,所以读的数据是从从库中读取的。即写是写到主库中,读是从从库读。

参考链接:http://www.cnblogs.com/yangligogogo/articles/1939938.html

三. 将shell脚本加入linux中的计划任务中

将shel脚本加入linux中计划任务,可以通过contrab -e命令实现,通过这个命令可以打开当前用户的计划任务编辑器,用户只需要在这里输入自己想要什么时间想要执行的命令就可以了。linux会定期地从该文件中读取命令并执行。

首先,我们输入命令:contrab -e

然后会打开一个编辑器,在其中输入下面这个命令:

0 5 * * * cd /home/lincheung; sh PP_insert_db.sh

之后保存退出即可。这样便加入了linux的计划任务中,上面的命令会每天凌晨5点执行。

参考链接:http://blog.csdn.net/21aspnet/article/details/6798179

原创粉丝点击