天天看點

分析日志檔案

在tomcat中安裝logback插件,此插件用于生成日志。該日志中包括很多資訊,我們的目的是将需要的資料進行整理,将其插入到mysql資料庫中,并将其做成定時任務執行。

一下是原日志檔案内容:

分析日志檔案

我們需要client,uniquecode,device,versioncode,interface,createtime這些字段

思路如下:

1.我們隻需要對包含接口和請求開始字段的行進行資料整理。

grep "personal/checkupdate.json請求開始"   /home/logs/fight_cancer_interface/info.2014-05-19.log

分析日志檔案

2.我們要确定這些行中必須包括client,uniquecode,device,versioncode,interface,createtime這些字段。

grep "personal/checkupdate.json請求開始"  /home/logs/fight_cancer_interface/info.2014-05-19.log|grep "client="|grep "uniquecode="|grep "device="|grep "client="|grep "versioncode="

分析日志檔案

3.需要将多餘的字段删除

grep "personal/checkupdate.json請求開始"   /home/logs/fight_cancer_interface/info.2014-05-19.log|grep "client="|grep "uniquecode="|grep "device="|grep "client="|grep "versioncode="|awk -f"請求開始--:" '{print $1,$2}'|awk -f"info  com.wyqj.fightcancer.intercepter.loginterceptor - /fight_cancer_interface/" '{print $1,$2}'|awk -f".json" '{print $1,$2}'|awk -f"[" '{print $1,"@@@###",$2}'|awk -f"]" '{print $1,"@@@###",$2}'|awk -f'@@@###' '{print $1,$3}'|sed 's/personal\/checkupdate/personal_checkupdate/g' | awk -f ",[[:digit:]][[:digit:]][[:digit:]]" '{print $1,$2}'|sed "s/  {/,/g"|sed "s/       personal/,personal/g"|sed "s/}//g"|awk -f"," '{print $6","$3","$5","$7","$2","$1");"}'|sed "s/,/\',\'/g"|sed "s/);/\');/g"|sed "s/^/\'/g"

分析日志檔案

4.将最前面加入資料庫插入語句

grep "personal/checkupdate.json請求開始"   /home/logs/fight_cancer_interface/info.2014-05-18.log|grep "client="|grep "uniquecode="|grep "device="|grep "client="|grep "versioncode="|awk -f"請求開始--:" '{print $1,$2}'|awk -f"info  com.wyqj.fightcancer.intercepter.loginterceptor - /fight_cancer_interface/" '{print $1,$2}'|awk -f".json" '{print $1,$2}'|awk -f"[" '{print $1,"@@@###",$2}'|awk -f"]" '{print $1,"@@@###",$2}'|awk -f'@@@###' '{print $1,$3}'|sed 's/personal\/checkupdate/personal_checkupdate/g' | awk -f ",[[:digit:]][[:digit:]][[:digit:]]" '{print $1,$2}'|sed "s/  {/,/g"|sed "s/       personal/,personal/g"|sed "s/}//g"|awk -f"," '{print $6","$3","$5","$7","$2","$1");"}'|sed "s/,/\',\'/g"|sed "s/);/\');/g"|sed "s/^/\'/g"|sed 's/^/insert into `fight_cancer`.`tb_statistics_base_info` (`client`,`uniquecode`,`device`,`versioncode`,`interface`,`createtime`) values  (/g'|sed "s/client=//g"|sed "s/uniquecode=//g"|sed "s/device=//g" |sed "s/versioncode=//g"

分析日志檔案

5.将這些sql語句生成.sql檔案

grep "personal/checkupdate.json請求開始"   /home/logs/fight_cancer_interface/info.2014-05-18.log|grep "client="|grep "uniquecode="|grep "device="|grep "client="|grep "versioncode="|awk -f"請求開始--:" '{print $1,$2}'|awk -f"info  com.wyqj.fightcancer.intercepter.loginterceptor - /fight_cancer_interface/" '{print $1,$2}'|awk -f".json" '{print $1,$2}'|awk -f"[" '{print $1,"@@@###",$2}'|awk -f"]" '{print $1,"@@@###",$2}'|awk -f'@@@###' '{print $1,$3}'|sed 's/personal\/checkupdate/personal_checkupdate/g' | awk -f ",[[:digit:]][[:digit:]][[:digit:]]" '{print $1,$2}'|sed "s/  {/,/g"|sed "s/       personal/,personal/g"|sed "s/}//g"|awk -f"," '{print $6","$3","$5","$7","$2","$1");"}'|sed "s/,/\',\'/g"|sed "s/);/\');/g"|sed "s/^/\'/g"|sed 's/^/insert into `fight_cancer`.`tb_statistics_base_info` (`client`,`uniquecode`,`device`,`versioncode`,`interface`,`createtime`) values  (/g'|sed "s/client=//g"|sed "s/uniquecode=//g"|sed "s/device=//g" |sed "s/versioncode=//g" > 2014-05-18.sql

6.将sql檔案生成資料庫

mysql -u使用者名 -p密碼  資料庫名  < 2014-05-18.sql

7.完善腳本

#!/bin/bash

#dates=`date  +%y-%m-%d`

dates=`date -d"1 days ago" +%y-%m-%d`

path_log=/home/logs/fight_cancer_interface/info.$dates.log

path_sql=/home/sql/$dates.sql

grep "personal/checkupdate.json請求開始"   $path_log|grep "client="|grep "uniquecode="|grep "device="|grep "client="|grep "versioncode="|awk -f"請求開始--:" '{print $1,$2}'|awk -f"info  com.wyqj.fightcancer.intercepter.loginterceptor - /fight_cancer_interface/" '{print $1,$2}'|awk -f".json" '{print $1,$2}'|awk -f"[" '{print $1,"@@@###",$2}'|awk -f"]" '{print $1,"@@@###",$2}'|awk -f'@@@###' '{print $1,$3}'|sed 's/personal\/checkupdate/personal_checkupdate/g' | awk -f ",[[:digit:]][[:digit:]][[:digit:]]" '{print $1,$2}'|sed "s/  {/,/g"|sed "s/       personal/,personal/g"|sed "s/}//g"|awk -f"," '{print $6","$3","$5","$7","$2","$1");"}'|sed "s/,/\',\'/g"|sed "s/);/\');/g"|sed "s/^/\'/g"|sed 's/^/insert into `fight_cancer`.`tb_statistics_base_info` (`client`,`uniquecode`,`device`,`versioncode`,`interface`,`createtime`) values  (/g'|sed "s/client=//g"|sed "s/uniquecode=//g"|sed "s/device=//g" |sed "s/versioncode=//g" > $path_sql

mysql -u使用者名 -p密碼  資料庫名  < $path_sql

8.将此腳本做成定時任務

crontab -e

分析日志檔案

[注]這裡我做了兩個定時任務,這裡需要注意的是,23點59分執行資料庫備份腳本,01點01分執行日志整理腳本。日志整理腳本必須在資料庫備份腳本執行之後執行。因為如果日志檔案過大,需要很長時間執行,如果在其還沒執行完就進行資料庫備份,可能會出現問題。

這個腳本需要熟練運用sed和awk,通過此腳本也看出了sed和awk功能的強大。我之前嘗試使用cut指令進行資料分割,都沒能如願。希望以後能更深入地學習sed和awk,并能夠掌握sed和awk程式設計。