高效处理apache日志
通常apache日志的格式如下:
19021 id.zdanswer.cn 222.209.211.147 - - [10/Sep/2009:12:47:10 +0800] "GET /afsunion/xdpsrp.js HTTP/1.1" 200 1674 "http://www.baidu.com/s?dn=http%3A%2F%2Fwww.baidu.com%2Fs&pc=103&ctype=2&wd=%C9%C1%C1%C1%B5%C4%C8%D5%D7%D3+%C2%DE%B4%F3%D3%D3&tn=13800_pg" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Sicent)"
一般是将日志轮滚,并将前期日志处理后导入mysql数据库,再进行数据挖掘和分析。但是默认的数据格式mysql不支持。所以我们将其按需求转成如
下的格式:
2009-09-10 12:47:19 222.209.211.147 id.zdanswer.cn /afsunion/3mansotrack.php?oc=richtech1_pg&iad=2&1252557749234 200 http://www.baidu.com/s?dn=http%3A%2F%2Fwww.baidu.com%2Fs&pc=103&ctype=2&wd=%B0%A2%B0%D3%CA%A6%D7
这里用到awk和sed,采用awk内置函数,充分发挥awk的性能,在一台赛扬2.2G CPU,2G内存的机器上处理500多MB的apache日志花费2分30秒。可以说
还算高效的,哈哈。各位看官有没有更好的办法啊?咱们一起学习。
awk '{$6=substr($6,2,20) ;$13=gensub(/["]/,"","g",$13) ; print $6"\t"$3"\t"$2"\t"$9"\t"$11"\t"$13} ' $1 |sed -e '{s/\(.*\)\/\(.*\)\/\(....\):\(.*\)/ \3-\2-\1 \4 /;s/Jan/01/;s/Feb/02/;s/Mar/03/;s/Apr/04/;s/May/05/;s/Jun/06/;s/Jul/07/;s/Aug/08/;s/Sep/09/;s/Oct/10/;s/Nov/11/;s/Dec/12/}' > /tmp/s1.log
PS: live writer的代码插件用的很爽!