mysql语法检查工具_基于SQL的日志分析工具myselect

myselect是一个简化日志分析的工具,使用类SQL语法对日志进行统计分析,提供类似于数据库查询的功能,便于理解与使用。它与awk等命令相比,提供了更直观的分析方式,尤其适合对日志进行频率统计、时间分析等操作。
摘要由CSDN通过智能技术生成

基本介绍

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

SQLyog 是一个快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库,由业界著名的Webyog公司出品。 使用SQLyog可以快速直观地让您从世界的任何角落通过网络来维护远端的MySQL数据库。 1、基于C++和MySQLAPI编程; 2、方便快捷的数据库同步与数据库结构同步工具; 3、易用的数据库、数据表备份与还原功能; 4、支持导入与导出XML、HTML、CSV等多种格式的数据; 5、直接运行批量SQL脚本文件,速度极快; 6、新版本更是增加了强大的数据迁移。 快速备份和恢复数据。 以GRID/TEXT格式显示结果。 支持客户端挑选、过滤数据。 批量执行很大的SQL脚本文件。 快速执行多重查询并能够返回每页超过1000条的记录集,而这种操作是直接生成在内存中的。 程序本身非常短小精悍!压缩后只有348 KB。 完全使用MySQL C APIs程序接口。 以直观的表格界面建立或编辑数据表。 以直观的表格界面编辑数据。 进行索引管理。 创建或删除数据库。 操纵数据库的各种权限:库、表、字段。 编辑BLOB类型的字段,支持Bitmap/GIF/JPEG格式。 输出数据表结构/数据为SQL脚本。 支持输入/输出数据为CSV文件。 可以输出数据库清单为HTML文件。 为所有操作建立日志。 个人收藏管理操作语句。 支持语法加亮显示。 可以保存记录集为CSV、HTML、XML格式的文件。 99%的操作都可以通过快捷键完成。 支持对数据表的各种高级属性的修改。 查看数据服务器的各种状态、参数等。 支持更改数据表类型为ISAM、MYISAM、MERGE、HEAP、InnoDB、BDB。 刷新数据服务器、日志、权限、表格等。 诊断数据表--检查、压缩、修补、分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值