基于SQL的日志分析工具myselect

基本介绍

程序开发人员经常要分析程序日志,包括自己打印的日志及使用的其它软件打印的日志,如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 语句语法,像as关键字及or逻辑操作符还没有实现,但这不重要。在日志文件很大时,php实现的版本在性能以及内存占用上都无法达到真正实用状态,但相信不久就会有go语言实现的高可用版本。

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

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

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

基于SQL的日志分析工具myselect

时间: 2024-10-08 07:05:37

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

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

Log Parser(微软网站下载)是微软公司出品的日志分析工具,它功能强大,使用简单,可以分析基于文本的日志文件.XML 文件.CSV(逗号分隔符)文件,以及操作系统的事件日志.注册表.文件系统.Active Directory.它可以像使用 SQL 语句一样查询分析这些数据,甚至可以把分析结果以各种图表的形式展现出来. Log Parser 的安装很简单,没有什么特别的,安装之后,可以在安装目录下找到 LogParser.chm 这个文件,该文件是 LogParser 的帮助文件,为英语语言

loganalyzer日志分析工具(CentOS7.4)

loganalyzer日志分析工具(CentOS7.4)Loganalyzer是一款syslog日志和其他网络事件数据的Web前端.它提供了对日志的简单浏览.搜索.基本分析和一些图表报告的功能.数据可以从数据库或一般的syslog文本文件中获取,所以LogAnalyzer不需要改变现有的记录架构.基于当前的日志数据,它可以处理syslog日志消息,Windows事件日志记录,支持故障排除,使用户能够快速查找日志数据中看出问题的解决方案 (1) 安装LAMP环境 yum -y install ht

mysql慢查询日志分析工具mysqlsla

一.介绍    mysqlsla是一个分析mysql慢日志的工具,可以分析出慢查询的原因,包括执行某条sql出现的次数及在slow log数据的百分比.执行时间.等待销的时间等. 公司的数据库有很多慢查询日志,导致的系统的负载很高,而mysql慢查询日志文件内容格式不太好看,经推荐使用mysqlsla:使用方便,操作简单. 二.安装mysqlsla 系统环境 CentOS release 6.6 (Final) 2.6.32-504.el6.x86_64 官网已经不能下载,所需要的文件已在百度云

AWStats日志分析工具

awstats官方网站:http://awstats.sourceforge.net/ perl官方网站:http://www.perl.com/ Awstats是一个非常简洁而且强大的统计工具.它可以统计您站点的如下信息: 一:访问量,访问次数,页面浏览量,点击数,数据流量等精确到每月.每日.每小时的数据二:访问者国家.访问者IP.操作系统.浏览器等三:Robots/Spiders的统计四:纺客持续时间五:对不同Files type 的统计信息六:Pages-URL的统计七:其它信息(搜索关键

project03日志分析工具AWStats

++++++++++++++++++++ 日志分析工具AWStats ++++++++++++++++++++ http://www.oschina.net/project http://www.oschina.net/project/tag/147/log-analyzer --统计日志分析工具 http://www.awstats.org/ --官方网站 http://www.nltechno.com/awstats/awstats.pl?config=destailleur.fr  --官

慢查询日志分析工具mysqldumpslow

mysqldumpslow是mysql自带的一种慢查询日志分析工具,顾名思义,就是查询那些出那些查询慢的SQL语句,由此分析出SQL查询效率慢的原因. 通常来说,mysqldumpslow分组查询的结果是相似的,它在展示统计结果时,可以将数字和字符串分别抽象成"N"和"S".当然也可以用-a 和 -n选项可以用来修改这些抽象的行为. mysqldumpslow查询命令 mysqldumpslow [options] [log_file] mysqldumpslow可

linux下搭建HTTP网站服务器和网站日志分析工具AWStats的使用

服务器IP地址:192.168.4.5 服务器主机名:srv5.tarena.com 1.在服务器端安装httpd软件包 [[email protected] /]# yum -y install httpd [[email protected] /]# service httpd start [[email protected] /]# chkconfig httpd on 2.在客户机端验证 在浏览器中输入192.168.4.5 如果显示欢迎页面表示服务器搭建成功 3.部署网页文档 首先将欢

日志分析工具-ApexSQL介绍

原文:日志分析工具-ApexSQL介绍 使用场景:业务数据异常变化,通过代码分析不出来的时候,迫不得已需要通过日志来分析 下载地址:http://www.apexsql.com/Download.aspx?download=log 使用要点: 日志的原理导致他不能显示原始SQL,只能记录前后变化,这个是日志本身的机制 可以通过事务Id判断是否同一事务,但是要了解其修改过程还是需要业务上的经验. 记录事务发生的时间,不记录发起者的程序名称和客户端信息 样例代码: CREATE TABLE [dbo

[翻译]mongodb日志分析工具mtools之mplotqueries

mtools是一组非常好用的mongodb日志分析工具,里面最复杂的命令是mplotqueries,上网查了一下,还没有人翻译过.英文不好,费了好大的劲翻完,翻的不好,但没有办法,我英文水平就这么多~ 原文地址:https://github.com/rueckstiess/mtools/wiki/mplotqueries ----------------------------------------------------------------------------------------