基本介绍

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

    原文地址:http://blog.csdn.net/chenmoquan/article/details/44943245#comments 觉得写的很适合web开发的新手 Chrome 的开发者工具 ...

  2. linux 监控服务器脚本

    #!/bin/bash ctime=`date +%x%T`monitor_dir=/home/jk/if [ ! -d $monitor_dir ]; then    mkdir $monitor_ ...

  3. #module-django.db.models

    Models A model is the single, definitive source of information about your data. It contains the esse ...

  4. 练习2 A - ASCII码排序

      Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description 输入三 ...

  5. ps的使用方法

    1.打开原图素材,Ctrl + J把背景图层复制一层,按Ctrl + Shift + U去色,执行:滤镜 > 模糊 > 高斯模糊,数值4,图层混合模式为滤色,图层不透明度改为27%. 2. ...

  6. 转:fork的解释

    原文来自于:http://baike.baidu.com/view/1952900.htm?fr=aladdin fork编辑 叉子\分岔\岔口\复刻,西方人吃饭用的东西,经常用作刀和叉. 计算机程序 ...

  7. Python 日期格式化 及 schwartzian排序

    __author__ = 'root' import datetime import time import copy # 12/Dec/2012:23:59:50 # 12/Sep/2012:23: ...

  8. BZOJ 1257 余数之和

    Description 给出正整数\(n\)和\(k\),计算\(j(n, k)=k\;mod\;1\;+\;k\;mod\;2\;+\;k\;mod\;3\;+\;-\;+\;k\;mod\;n\) ...

  9. iOS Developer Libray (中文版)-- Defining Classes 定义类

    该篇是我自己学习iOS开发时阅读文档时随手记下的翻译,有些地方不是很准确,但是意思还是对的,毕竟我英语也不是很好,很多句子无法做到准确的字词翻译,大家可以当做参考,有错误欢迎指出,以后我会尽力翻译的更 ...

  10. Unity 用C#脚本读取JSON文件数据

    读取JSON文件数据网上有很多方法吗,这里采用SimpleJSON,关于SimpleJSON的介绍参考以下链接:http://wiki.unity3d.com/index.php/SimpleJSON ...