基本介绍

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

    一,在bar的属性中有optionbar,可以做一些设置. 其中比较有用的是:1,去掉最右边的箭头:allowquickcustomization 改为false 2,去掉最左边的竖线:drawdra ...

  2. jquery插件dataTables自增序号。

    dataTables官网提供了一种方式,使用后没有达到预期效果(js报错),没有深究原因.如果需要,可以按照下面的方式来. $('#dataList').dataTable({ "langu ...

  3. ThinkPHP 自动验证与自动填充无效可能的原因

    原文链接:http://www.5idev.com/p-thinkphp_validate_auto_Invalid.shtml 自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇 ...

  4. SSH三种框架及表示层、业务层和持久层的理解

    Struts(表示层)+Spring(业务层)+Hibernate(持久层) SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts:Struts是一个表示 ...

  5. JavaScript的组成—ECMAScript、BOM和DOM

      JavaScript 是一种基于 ECMAScript 规范的脚本语言,并在此基础上进行了自己的封装.ECMAScript 不是一种编程语言,仅仅是一种脚本语言规范,由欧洲计算机协会制定和发布,任 ...

  6. 【Linux】常用命令-统计代码行数

    公司人员流动大,经常有新的维护任务,交接时喜欢看看新来的模块的代码量,那么问题来了, 如何统计代码行数? 1,最先想到的肯定是 wc. wc -l *.h 将查看[当前目录]下头文件的代码行数,输出结 ...

  7. 见过NTP服务,没见过网络流量到200M左右的NTP服务

    XXX,看来可能是NTP.CONF的文件配置错误所致了. 附上一段查看网络流量的SHELL.(好像只针对ETH0,如果要看其它的,还需要修改) #!/bin/bash typeset in_old d ...

  8. 设计模式之观察者模式(Observer Pattern)

    一.什么是观察者模式? 把现实世界中的报纸与订阅者的关系抽象出来就是观察者模式,一种报纸对应多个订阅者,订阅者可以随时解除订阅,未订阅的读者也可以随时开始订阅.一旦有新报纸发布,所有的订阅者都会收到新 ...

  9. MySql的rpm安装

    MySQL 5.5(rpm格式)在Linux 上安装 Linux系统上安装MySQL 5.5prm 1.准备工作 从MySQL官网上分别下载mysql服务器端于客户端包. 下载步骤:Downloads ...

  10. BZOJ 1072 [SCOI2007]排列perm

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1268  Solved: 782[Submit][Sta ...