基本介绍

程序开发者常常要分析程序日志,包括自己打印的日志及使用的其他软件打印的日志,如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

甚至全然单纯使用awk都能够实现以上功能,但有其他更好用的命令这样显得不是必需了

myselect怎样实现以上功能? myselect将日志行看成多个字段,字段间以空格分隔,在双引號中的全部字符是算作一个字段的,即使当中包含空格,这点与awk纯粹以空格分隔是不同的,这使我们处理日志也更方便。能够通过例如以下命令查看某一日志行各字段值:

$ myselect -s '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'

**log fields** 

$1   198.52.103.14 

$2   - 

$3   - 

$4   [29/Jun/2014:00:17:11 

$5   +0800] 

$6   GET /q/1403060495509100 HTTP/1.1 

$7   200 

$8   26788 

$9   http://wenda.so.com/q/1403060495509100 

$10   Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727) 

$11   221 

$12   0.532

-s选项将日志行各字段值打印出来,接下来能够依据相应字段进行计算,例如以下

$ myselect 'select count($1),$1 from accesstest.log group by $1 order by count($1) desc limit 10' 

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 61.174.51.174

结果全然一样

还有一个经常使用的需求是查看每分钟的流量,并观察流量异常的情况,用awk等命令例如以下:

$ awk '{ print gensub(/.*2014:(.+):.*+0800].*/,"\\1","g")}' access_wenda.qihoo.com_log | uniq -c | grep -v Windows | less 

1567 00:17 

1597 00:17 

933 00:18 

3045 00:18 

1605 00:19 

294 00:19 

2021 00:19 

1315 00:20 

666 00:20 

1875 00:20 

3679 00:21 

1172 00:22 

479 00:22 

2094 00:22 

1352 00:23 

51 00:23 

37 00:23

grep -v Windows是为了过滤掉一些乱码行,在awk我们须要通过gensub获得子的字段,如这里的分钟值,而在myselect也有相同的功能的函数regsub($1,pattern,replace),用myselect 完毕相同的需求例如以下:

$ myselect 'select regsub($4, /.*2014:(.+):\d{2}.*/,\1),count($1) from access_wenda.qihoo.com_log group by regsub($4, /.*2014:(.+):\d{2}.*/,\1) order by count($1)desc limit 10'

regsub($4, /.*2014:(.+):\d{2}.*/,\1),我们对第4个字段使用正则获得分钟值。

再比方我们要计算网络请求平均耗时,用awk能够实现,但过程比較复杂,须要定义变量并进行计算,而用myselect 仅仅须要 利用 avg函数较为简单计算出来,例如以下

$ myselect 'select avg($12) from access_wenda.qihoo.com_log'

从以上的对照中,能够发现myselect是以写sql方法进行统计,不但好记,并且分析思路比較直观,不像awk须要一堆命令进行配合。

或许你会说把日志放到数据库再分析也一样,只是这个过程太麻烦了,不如直接对文件用SQL分析。

myselect 使用

安装myselect 程序后,能够查看用法

$ myselect -h 

usage: 

myselect 'sql sentence'; 用 sql进行统计分析 

myselect -s 'log line';对日志行按空格进行切割编号 

myselect -n 'log line' 'sql sentence'; 对日志行用sql进行解析 

myselect -p 'sql sentence'; 查看sql语法解析结果 

myselect -c 'sql sentence'; 查看sql计算过程

统计分析基本使用例如以下

$ myselect 'sql语句'

sql语句语法基本与普通数据库查询select语句一致,不区分大写和小写(当然,文件名称是区分大写和小写的),支持自由格式,仅仅有小部分不同,我们有理由相信sql语言在统计分析上一定是眼下最优的语言,基本照着它来实现即可了。

sql语句 = SELECT 

select_expr [, select_expr ...] 

[FROM file_name 

[WHERE where_condition] 

[GROUP BY {col_name | expr } 

[HAVING where_condition] 

[ORDER BY {col_name | expr } 

[ASC | DESC]] 

[LIMIT {[offset,] row_count }]

简单说明例如以下:

select_expr

能够包含字段编号如$1,$2,字段以空格分隔,也能够包含函数,函数分两类 

字符串处理函数:

  • strsub($1,2,3) 截取子字符串
  • regsub($1,/(.):(.+):(.)/i,\2) 按正则替换子字符串

字符串函数能够用在不论什么字段能够出现的地方,它的參数也包含了字段编号

聚合函数:

  • count
  • sum
  • agv
  • max
  • min

意义与普通sql一样。

where_condition

用and 连接起来的关系表达式,眼下还不支持or, 支持例如以下的操作符 

=,!=,>,<,>=,<=,like,rlike 

like表示是否包含对应字符串,rlike表示正则匹配对应模式

原计划myselect用go语言实现,并看了一遍go手冊,但在我们组内技术期刊投稿截止之前的非常短时间里无法用一门刚看的语言来实现它,转而先用php实现一个了版本号,而且基本可用,眼下实现的php版本号实现了基本的sql select 语句语法,像askeyword及or逻辑操作符还没有实现,但这不重要。在日志文件非常大时,php实现的版本号在性能以及内存占用上都无法非常好满足要求,但相信不久就会有go语言实现的高可用版本号。

对于不熟悉awk或一下无法记起awk语法细节的人来说,在须要分析日志时myselect能够非常好实现我们的需求,sql语言大家都应该是非常熟悉的。

本工具源代码已放到到了 github   https://github.com/micweaver/myselect





基本实现算法在里面,接下来要翻译成go语言实现,go语言能非常好的满足我们对性能及内存占用的需求,当然极大的日志你要借助于hadoop,hive等分布式计算工具

基于SQL的日志分析工具myselect的更多相关文章

  1. Log Parser 微软强大的日志分析工具

    Log Parser(微软网站下载)是微软公司出品的日志分析工具,它功能强大,使用简单,可以分析基于文本的日志文件.XML 文件.CSV(逗号分隔符)文件,以及操作系统的事件日志.注册表.文件系统.A ...

  2. Eventlog Analyzer日志管理系统、日志分析工具、日志服务器的功能及作用

    Eventlog Analyzer日志管理系统.日志分析工具.日志服务器的功能及作用 Eventlog Analyzer是用来分析和审计系统及事件日志的管理软件,能够对全网范围内的主机.服务器.网络设 ...

  3. 日志分析工具ELK配置详解

    日志分析工具ELK配置详解 一.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分 ...

  4. 可视化日志分析工具Gltail的安装与使用

    可视化日志分析工具Gltail的安装与使用      GlTail.rb 是一款带有浓郁的 Geek 风格的可视化日志分析工具,它采用 Ruby 技术构建,并利用 OpenGL 图形技术进行渲染,呈现 ...

  5. 日志分析工具-ApexSQL介绍

    原文:日志分析工具-ApexSQL介绍 使用场景:业务数据异常变化,通过代码分析不出来的时候,迫不得已需要通过日志来分析 下载地址:http://www.apexsql.com/Download.as ...

  6. MySQL慢查询日志总结 日志分析工具mysqldumpslow

    MySQL慢查询日志总结 - 潇湘隐者 - 博客园 https://www.cnblogs.com/kerrycode/p/5593204.html 2016-06-17 10:32 by 潇湘隐者, ...

  7. Linux 日志分析工具之awstats

    一.awstats 是什么 官方网站:AWStats is a free powerful and featureful tool that generates advanced web, strea ...

  8. (3.14)mysql基础深入——mysql 日志分析工具之pt-querty-digest【待完善】

    (3.14)mysql基础深入——mysql 日志分析工具之pt-querty-digest 关键字:Mysql日志分析工具.mysqlsla 常用工具 [1]mysqldumpslow:官方提供的慢 ...

  9. (3.13)mysql基础深入——mysql日志分析工具之mysqlsla【待完善】

    (3.13)mysql基础深入——mysql 日志分析工具之mysqlsla 关键字:Mysql日志分析工具.mysqlsla 常用工具 [1]mysqldumpslow:官方提供的慢查询日志分析工具 ...

随机推荐

  1. Java Web开发介绍

    转自:http://www.cnblogs.com/pythontesting/p/4963021.html Java Web开发介绍 简介 Java很好地支持web开发,在桌面上Eclipse RC ...

  2. 最精简的代理设计模式demo - 保姆看孩子

    1,协议文件 @protocol NursePtotocol <NSObject> //保姆的协议方法 - (void)startToAmuseBaby; @end 2,管理类(使用类) ...

  3. iOS的launch image --备用

    当我们打开一款应用程序的时候,首先映入眼帘的往往并不是程序的主界面,而是经过精心设计的欢迎界面,这个界面通常会停留几秒钟,然后消失.看似很平常的一个小小的欢迎界面,其实还大有讲究. 一.为什么会出现欢 ...

  4. 【MySQL】SQL语法,between and 使用注意事项

    业务代码中有条查询学生姓名的sql: select stu_name from stu_info where stu_id between id_1 and id_2; 估计当时一时恍惚,拼接sql时 ...

  5. BZOJ 1009 GT考试

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...

  6. Extjs通过structs2生成树结构

    Extjs为我们提供了强大的树的生成方式,我们不必通过原始的js去生成树形结构.在这里我做了一个简单的树结构生成.代码如下,同时在后台使用了fastjson-1.1.15.jar的jar包生成json ...

  7. UpdateLayeredWindow是炫效果的关键

    自绘——是的,输入框每个字都自己绘制,计算行宽,行高,模拟光标闪烁,处理输入法的各种事件,以及选中,拖动等功能. 支持支持一下,实际上无句柄的,就是多行富文本编辑比较麻烦,其他的,都不复杂.很容易实现 ...

  8. struts2.0 struts.xml配置文件详解

    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quo ...

  9. Lua table使用

    days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Th ...

  10. java学习面向对象之设计模式之单例模式

    就像上一节当中我们讲到的数组工具集一样,如果我们把他看作一个类,来应用,不阻止他new函数的话,这个类我们在整个过程当中我们只是用他来当一个工具.假如每次用都要new一下产生一个新对象的话,就会显得整 ...