通过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
- 通过awk对日志文件每天统计并入库到MySQL的过程讲解
- Linux下通过php对Mysql中的数据进行定时统计并入库
- oracle存储过程通过http接收xml文件并解析入库
- 监听器监听日志,实时读取日志文件,把读取到的数据入库
- Mysql(case/coalesce) 通过产品表和出入库表实现产品出入库统计
- 解析日志文件入库的代码
- java通过ftp方式读取文件,并解析入库
- java通过ftp方式读取文件,并解析入库
- java通过ftp方式读取文件,并解析入库
- grep , awk 和 wc 等 Linux 命令能实现对日志的检索和统计
- linux命令 对日志文件的IP出现的次数进行统计 并显示次数最多的前六名
- 通过监听文件日志统计连接情况的perl脚本
- java通过filter实现操作日志入库的实现
- shell脚本对apache日志分割并统计保存到数据库
- 搜狗引擎查询日志的数据入库(Mysql…
- 统计系统的登录信息 并写入到文件中
- awk统计目录下最大的文件
- 通过日志文件分析Peercast频道的创建过程
- [启迪]给年轻程序员的建议
- 掌握规律
- CentOS搭建xfce桌面+VNC教程
- hdu1839 二分+最短路
- hdu 1175 连连看
- 通过awk对日志文件每天统计并入库到MySQL的过程讲解
- 答题技巧
- Codeforces 242C King‘s Path(BFS+STL)
- 面试题300道
- 今天4-11
- struts2小笔记积累
- ADO.NET<数据库连接总汇>
- 第十一届中国国际软件合作洽谈会——ChinaSoft2013——2013年4月11日上午摘要
- setInterval() 方法使用