基于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 语句语法,像askeyword及or逻辑操作符还没有实现,但这不重要。在日志文件非常大时,php实现的版本号在性能以及内存占用上都无法非常好满足要求,但相信不久就会有go语言实现的高可用版本号。

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

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


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

转载于:https://www.cnblogs.com/yxwkf/p/3860261.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老黄的2021

0x01 21年怎么说呢&#xff0c;平淡中带点惊喜。21年在现在的公司待满 2 年了&#xff0c;仔细想想&#xff0c;还真是&#xff0c;这是第一个待满 2 年的公司。这一年&#xff0c;有了很多的挑战&#xff0c;业务上的&#xff0c;技术上的&#xff0c;管理上的都是。下半年开始…

document.elementFromPoint

先说一下这个方法的参数 elemntFromPoint(x,y);//传入坐标值&#xff0c;返回当前页面上包含该坐标点的顶层元素 注意2点&#xff0c;坐标值和顶层元素 先说坐标&#xff0c;因为不同的人理解是不一样的&#xff0c;也就造就了这个方法在不同的浏览器中表现是不一样的&#xff…

Tree的前序序列化

Tree的序列化 比如有一颗树是这样的 1 2 3 如果它这个节点本身不是空则输入自己的值然后加上“!#” 如果是空则打印“#” …

iis6 开启options方法_《王者荣耀》暗夜危机什么时候开启 暗夜危机开启时间

导读 王者荣耀神秘关卡暗夜危机怎么进&#xff1f;许多玩家对于这个暗夜危机的关卡还不太熟悉&#xff0c;不知道如何开启&#xff0c;下面就让九游小编为大家带来&#xff0c;王者荣耀暗夜危机开启方法介绍。 王者荣耀神秘关卡暗夜危机怎么进&#xff1f; 峡谷异闻... 王者荣耀…

全球顶级大学,在中国录取率却不足0.5%,答案一针见血!

▲点击查看一提起新加坡教育&#xff0c;恐怕大家的第一反应都是&#xff1a;特别牛&#xff01;到底有多牛呢&#xff1f;我们拿数据说话——在全球公认的学生能力测试中&#xff0c;新加坡数学屡屡夺魁&#xff01;在“国际数学和科学评测趋势报告 2019”&#xff08;TIMSS&a…

div+css+js 树形菜单

2019独角兽企业重金招聘Python工程师标准>>> 代码&#xff1a; <div class"main_2"> <div class"m_left"> <ul class"nav"> <li id"bottom_none"><a href"#" onClick"DoMenu(C…

马化腾最崇拜的作家吴晓波《历代经济变革得失》读书笔记

吴晓波先生&#xff0c;是马化腾最崇拜的作家&#xff0c;腾讯的朋友说&#xff0c;马化腾逢人便推荐吴晓波的写的书《历代经济变革得失》&#xff0c;并亲自指示腾讯视频免费推广这个视频讲座。这本书我通读了两遍&#xff0c;总结了如下的笔记&#xff1a;

SQL:认识数据库约束

讲了关于数据库的很多内容&#xff0c;也讲了很多约束&#xff0c;对唯一和主键、核查和规则、外键约束很感兴趣。 一、唯一和主键&#xff08;实体完整性&#xff09;区别&#xff1a;数量&#xff1a;一张表只可以有一个主键约束&#xff0c;却可以有多个唯一约束。是否空值&…

Android之使用IDA Pro静态分析so文件

安卓应用程序的开发语言是java&#xff0c;但是由于java层的代码很容易被反编译&#xff0c;而反编译c/c程序的难度比较大&#xff0c;所以现在很多安卓应用程序的核心部分都使用NDK进行开发。关于NDK的开发知识点&#xff0c;请看这篇博客&#xff1a;Android之NDK开发。 关于…

.NET 6 中的 Logging Source Generator

.NET 6 中的 Logging Source GeneratorIntroLogging source generator 是 .NET 6 引入的一个新功能&#xff0c;借助 Source Generator 来实现&#xff0c;因为要用到 C# 9 中的分部方法(partial method)&#xff0c;C# 语言需要使用 9 及以上版本&#xff0c;具有更好的性能以…

电脑内部录音教程Virtual Audio Cable使用教程

1:下载Virtual Audio Cable2&#xff1a;安装Virtual Audio Cable3&#xff1a;设置&#xff08;注意这里line1不要开启监听其他设备&#xff09;3&#xff1a;打开声音传输通道软件C:\Program Files\Virtual Audio Cable\audiorepeater.exe点击start启动&#xff0c;最小化。4…

战队口号霸气押韵8字_高考励志班级口号霸气押韵大全

【导语】高考没有什么可怕的&#xff0c;一定要保证心态好&#xff0c;就可能考出比平时更好的成绩。下面是无忧考网分享的高考励志班级口号霸气押韵大全。欢迎阅读参考&#xff01;【篇一】高考励志班级口号霸气押韵1.激情澎湃&#xff0c;高考不败&#xff0c;斗志昂扬&#…

别说理科男不懂撩妹,这个老司机一生只爱两样:物理和18岁的少女

全世界只有3.14 % 的人关注了爆炸吧知识相信在很多人的眼中&#xff0c;科研人员都是正经和严肃的代名词。成就大&#xff0c;光芒大&#xff0c;仿佛天生圣人。但是超模君在和大家讲了这么多科学家的故事后&#xff0c;发现还是那句俗话说得好&#xff1a;科研是科研&#xff…

C#皮肤之IrisSkin4.dll

1. 将IrisSkin4.dll动态文件导入当前项目引用中。具体操作为&#xff1a;解决方案资源管理器->当前项目->引用->右键->添加引用&#xff0c;找到IrisSkin4.dll文件&#xff0c;然后加入即可。建议&#xff0c;最好把IrisSkin4.dll文件放在当前项目\bin\Debug文件中…

层遍历二叉树

层遍历二叉树 规则: 如果这个节点有值,则打印“值!" 如果这个节点没有值,则打印“#!” 从上到下,从左到右 比如: 1 …

一条nginx命令引发的对于容器的思考

去年的时候写了一篇原创《前后端分离&#xff0c;如何在前端项目中动态插入后端API基地址&#xff1f;&#xff08;in docker&#xff09;》&#xff0c; 我自认为这篇生产实践是对大前端、 容器化、CI/CD的得意之作。对于前后端分离的web项目&#xff0c;在容器启动的瞬间&…

部门树形结构,使用Treeview控件显示部门

部门树形结构。设计张部门表用于存储部门编码、名称、上级部门id&#xff0c;使用Treeview控件显示部门树&#xff0c;并实现部门增删改、移动、折叠等功能。特别提示&#xff0c;部门有层级关系&#xff0c;可用donetbar的adtree控件 代码如下 1 using System;2 using System.…

移动端 登陆 模板 html_聚会邀请函请柬模板 免费设计制作生成

制作邀请函 请关注我们聚会并非你的个人发布会和生活成果展&#xff0c;而在于描绘经历了风雨沧桑的那道彩虹&#xff0c;世事变化&#xff0c;聚会不是为了显示某人身居高位&#xff0c;也不是衣锦还乡或日过斗金、大富大贵的炫耀&#xff0c;重温那充满梦想的花样年华&#x…

他们是你学生时期的噩梦,但现在你可以把他们按在墙上摩擦了……

全世界只有3.14 % 的人关注了爆炸吧知识用艺术家的眼光去看科学&#xff0c;用人生的角度去看艺术。——尼采看过日剧的朋友都不会陌生下面的场景&#xff1a;日本主妇会将存放在冰箱中的东西列出清单&#xff0c;然后用磁贴将之贴在冰箱门上。每次购物或煮食后&#xff0c;她们…