当前位置: 首页 > 科技观察

尝试用SQL查看Linux日志,太有用了,飞起

时间:2023-03-16 10:38:29 科技观察

最近发现了一些有趣的工具,迫不及待想分享给大家。你通常如何查看Linux日志?比如我平时使用tail、head、cat、sed、more、less等经典系统命令,或者awk等三方数据过滤工具,结合起来查询效率非常高。但是在使用过程中有一件让我很头疼的事情,就是命令参数规则太多了,很伤记忆的人的大脑。有没有一种通用的查看日志的方式,比如用SQL查询,毕竟这是程序员比较熟悉的表达方式。今天分享的工具q,通过编写SQL实现了对文本内容的查询和统计。让我们看看这款产品到底有什么神奇之处。搭建环境q是一个命令行工具,可以让我们直接对任意文件或查询结果执行SQL语句查询,比如ps-efqueryprocess命令的结果集。目的是文本就是数据库表,嗯~当然这句话是我自己的理解,哈哈哈把普通文件或者结果集当作数据库表,支持几乎所有的SQL结构,比如WHERE,GROUPBY,JOINS等。支持自动检测列名和列类型,支持跨文件连接查询,这两个后面会详细介绍,支持多种编码。安装比较简单。在LinuxCentOS环境下,只需要完成以下三个步骤。Windows环境下,只需要安装一个exe即可使用。wgethttps://github.com/harelba/q/releases/download/1.7.1/q-text-as-data-1.7.1-1.noarch.rpm#下载版本sudorpm-ivhq-text-as-data-1.7.1-1.noarch.rpm#安装q--version#查看安装版本》官方文档:https://harelba.github.io/q语法q支持所有SQLiteSQL语法,标准命令行格式q+参数命令+"SQL"q""我想查询myfile.log文件的内容,直接q"SELECT*FROMmyfile.log".q"SELECT*FROMmyfile.log"q是没有问题的usewithoutadditionalparameters可以,但是使用参数会让显示结果更漂亮,所以这里简单了解一下,它的参数分为两种。input输入命令:指对要查询的文件或结果集进行的操作,如:-H命令,表示输入的数据包括标题行。q-H"SELECT*FROMmyfile.log"在这种情况下,列名将被自动检测并可以在查询语句中使用。如果未提供此选项,列将自动命名为cX,以c1开头,依此类推。q"selectc1,c2from..."output输出命令:作用于查询输出的结果集,如:-O,让查询结果显示列名。[root@iZ2zebfzaequ90bdlz820sZsoftware]#ps-ef|q-H"selectcount(UID)from-whereUID='root'"104[root@iZ2zebfzaequ90bdlz820sZsoftware]#ps-ef|q-H"selectcount(UID)from-whereUID='root'"计数(UID)104参数比较多,就不一一列举了。有兴趣的同学可以去官网查看。接下来,我们将着重演示如何使用SQL来处理各种查询日志场景。游戏中有很多小偷。下面我们来看几个常见的查询日志的场景,这个SQL是怎么写的。1.关键字查询关键字检索应该是日常开发中使用频率最高的操作,但是我个人认为q在这一点上没有优势,因为它在查询的时候必须指定某一个列。[root@iZ2zebfzaequ90bdlz820sZsoftware]#q"select*fromdouyin.logwherec9like'%tobeparsed%'"2021-06-1114:46:49.323INFO22790---[nio-8888-exec-2]c.x.douyin.controller.ParserController:解析URL:url=https%3A%2F%2Fv.douyin.com%2Fe9g9uJ6%2F2021-06-1114:57:31.938INFO22790---[nio-8888-exec-5]c.x.douyin.controller.ParserController:待解析URL:url=https%3A%2F%2Fv.douyin.com%2Fe9pdhGP%2F2021-06-1115:23:48.004INFO22790---[nio-8888-exec-2]c.x.douyin.controller.ParserController:待解析的URL:url=https%3A%2F%2Fv.douyin.com%2Fe9pQjBR%2F2021-06-112grep命令是全文搜索。[root@iZ2zebfzaequ90bdlz820sZsoftware]#catdouyin.log|grep'待解析的URL'2021-06-1114:46:49.323INFO22790---[nio-8888-exec-2]c.x.douyin.controller.ParserController:待解析的URL:url=https%3A%2F%2Fv.douyin.com%2Fe9g9uJ6%2F2021-06-1114:57:31.938INFO22790---[nio-8888-exec-5]c.x.douyin.controller.ParserController:待解析的URL:url=https%3A%2F%2Fv.douyin.com%2Fe9pdhGP%2F2,模糊查询类似模糊搜索,如果文本内容栏中有名字,直接使用栏名搜索,如果没有,直接使用列号c1、c2、cN。[root@iZ2zebfzaequ90bdlz820sZsoftware]#cattest.logabc2345232425[root@iZ2zebfzaequ90bdlz820sZsoftware]#q-H-t"select*fromtest.logwhereabclike'%2%'"Warning:columncountisone-didyouprovidethecorrectdelimiter?22324253、交集并集支持UNION和UNIONALL操作符对多个文件采取交集或并集。创建了两个文件,test.log和test1.log,如下所示。它们里面的内容有重叠,用union去重。q-H-t"select*fromtest.logunionselect*fromtest1.log"[root@iZ2zebfzaequ90bdlz820sZsoftware]#cattest.logabc2345[root@iZ2zebfzaequ90bdlz820sZsoftware]#cattest1.logabc3456[root@iZ2zebfzaequ90bdlz820sZsoftware]#q-H-t"select*fromtest.logunionselect*fromtest1.log"Warning:columncountisone-didyouprovidedthecorrectdelimiter?警告:columncountisone-didyouprovidethecorrectdelimiter?234564。内容去重例如统计某路径下./clicks.csv文件中去重后出现的uuid字段总数。q-H-t"SELECTCOUNT(DISTINCT(uuid))FROM./clicks.csv"5.列类型自动检测注:q会理解每一列是数字还是字符串,根据实数值比较还是字符串比较来判断过滤,这里会用到-t命令。q-H-t"SELECTrequest_id,scoreFROM./clicks.csvWHEREscore>0.7ORDERBYscoreDESCLIMIT5"6.字段操作读取系统命令查询结果,计算/tmp目录下每个用户和组的总值。可以对字段执行操作。sudofind/tmp-ls|q"SELECTc5,c6,sum(c7)/1024.0/1024AStotalFROM-GROUPBYc5,c6ORDERBYtotaldesc"[root@iZ2zebfzaequ90bdlz820sZsoftware]#sudofind/tmp-ls|q"SELECTc5,c6,sum(c7)/1024。1024AStotalFROM-GROUPBYc5,c6ORDERBYtotaldesc"wwwwww8.86311340332rootroot0.207922935486mysqlmysql4.76837158203e-067,数据统计系统中进程数最多的前3个用户ID,降序排列,需要结合系统命令使用,先查询allprocesses然后UsingSQLfiltering,这里的q命令相当于grep命令。ps-ef|q-h“selectuid,count(*)cntfrom-groupByuidOrderbyCntdesClimit3”[root@iz2zebfzaequ90bfzaequ90bdlz820szszsoftware]#ps-ef|q-f|q-h“selectuid,count(*)"SELECTUID,COUNT(*)cntFROM-GROUPBYUIDORDERBYcntDESCLIMIT3"UIDcntroot110www16rabbitmq4我们看到加和不加-O命令的区别在于是否显示查询结果的标题。8、连文件查找一般情况下,我们的日志文件每天都会被分成很多固定容量的子文件。在没有统一的日志采集服务器的情况下,如果不给出报错时间间隔去搜索关键词,那么无异于大海捞针。如果能把所有的文件内容合并起来再检查,会省去很多麻烦。q支持数据库表等文件的联合查询。q-H"select*fromdouyin.logajoindouyin-2021-06-18.0.logbon(a.c2=b.c3)whereb.c1='root'"看完总结,可能有人会反驳:q写那么多不好代码并直接使用awk?呃~推出这个工具的初衷并不是要取代现有的任何工具,而是提供一种更方便的查看日志的方法。我也在用awk,确实很强大,但是涉及到一个学习成本的问题。有多种命令和匹配规则。想要打好,还是要努力的。对于有一点数据库经验的新手程序员来说,写SQL问题不大,上手q会容易很多。