基本介绍
程序开发人员经常要分析程序日志,包括自己打印的日志及使用的其它软件打印的日志,如php,nginx日志等,linux环境下分析日志有一些内置命令可以使用,如grep,sort,uniq,awk等,其中最强大的是awk,是作为一门小巧的文本处理语言存在的,但由于它是一门语言,功能强大,但在命令行下使用并不那么方便,因为awk是面向计算而不是面向统计的。awk可以定义变量,可以进行计算,命令行下就是一个包含隐式for循环的语言。
awk如果很长时间不用,它的一些语法就忘了,要分析线上日志时就想如果能用sql分析该多好,确实,sql(结构化查询语言)是一门真正面向统计的语言,包括HIVE也是用它,于是近期开发了一个基于sql的日志分析器,可以用类sql语法分析日志,下面称它为myselect。
myselect是一个简化日志分析的工具,相信它已经覆盖了大部分awk能完成的日志分析功能,当然特殊情况下还是需要用到awk等。myselect把要分析日志文件当成一个数据库,里面的日志行当作数据库记录,从而对里面的日志数据进行统计分析。下面看看myselect与awk等其它命令在使用上的对比。
以分析ngnix日志为例,下面这条日志是我们线上web机器的一条日志
198.52.103.14 - - [29/Jun/2014:00:17:11 +0800] "GET /q/1403060495509100 HTTP/1.1" 200 26788 "http://wenda.so.com/q/1403060495509100" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)" 221 0.532
第一个字段是IP,如果要知道来源ip最多的是哪些,用 awk等其它命令实现如下
$ awk '{ print $1}' accesstest.log | sort | uniq -c | sort -k1nr | less
14 111.13.65.251
13 10.141.88.248
12 10.141.88.239
10 10.141.88.250
9 121.226.135.115
8 10.141.88.241
8 10.141.88.249
8 222.74.246.190
7 211.149.165.150
6 119.138.167.213