当前位置: 首页 > Linux

试了SQL查Linux日志,好用

时间:2023-04-06 22:20:49 Linux

大家好,我是小付~最近发现了一些有趣的工具,迫不及待的想分享给大家。你通常如何查看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+parametersCommand+"SQL"q""我想查询myfile.log文件的内容,直接q"SELECT*FROMmyfile.log"。q"SELECT*FROMmyfile.log"q不加参数使用是没有问题的,但是加参数会使显示结果更漂亮,所以这里简单了解一下,它的参数分为2种。input输入命令:指对要查询的文件或结果集进行的操作,如:-H命令,表示输入的数据包括标题行。q-H"SELECT*FROMmyfile.log"在这种情况下,列名将被自动检测并可以在查询语句中使用。如果未提供此选项,列将自动命名为cX,以c1开头,依此类推。q"selectc1,c2from..."output输出命令:作用于查询输出的结果集,例如:-O,让查询结果显示列名。[root@iZ2zebfzaequ90bdlz820sZ软件]#ps-ef|q-H"selectcount(UID)from-whereUID='root'"104[root@iZ2zebfzaequ90bdlz820sZsoftware]#ps-ef|q-H-O"selectcount(UID)from-whereUID='root'"count(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@iZ2zebfzaequ90bdlz820sZ软件]#猫抖音.log|grep'要解析的URL'2021-06-1114:46:49.323INFO22790---[nio-8888-exec-2]c.x.douyin.controller.ParserController:pendingParseURL: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%'"警告:列数是一个-你提供了吗正确的分隔符?22324253.Intersectionunion支持UNION和UNIONALL运算符来交叉或合并多个文件。创建了两个文件,test.log和test1.log,如下所示。它们里面的内容有重叠,用union去重。q-H-t"select*fromtest.logunionselect*fromtest1.log"[root@iZ2zebfzaequ90bdlz820sZ软件]#cattest.logabc2345[root@iZ2zebfzaequ90bdlz820sZ软件]#cattest1.logabc3456[root@iZ2zebfzaequ8]0#q-H-t"select*fromtest.logunionselect*fromtest1.log"警告:列数是一-你提供了正确的分隔符吗?警告:列数是一-你提供了正确的分隔符吗?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目录值。可以对字段执行操作。sudo查找/tmp-ls|q"SELECTc5,c6,sum(c7)/1024.0/1024AStotalFROM-GROUPBYc5,c6ORDERBYtotaldesc"[root@iZ2zebfzaequ90bdlz820sZsoftware]#sudofind/tmp-ls|q"SELECTc5,c6,sum(c7)/1024.0/1024AStotalFROM-GROUPBYc5,c6ORDERBYtotaldesc"wwwwww8.86311340332rootroot0.207922935486mysqlmysql4.76837158203e-067,统计系统进程最多的前三个用户ID按降序排列。这需要与系统命令结合使用。先查询所有进程,再用SQL过滤。这里的q命令相当于grep命令。ps-ef|q-H"SELECTUID,COUNT(*)cntFROM-GROUPBYUIDORDERBYcntDESCLIMIT3"[root@iZ2zebfzaequ90bdlz820sZ软件]#ps-ef|q-H"SELECTUID,COUNT(*)cntFROM-GROUPBYUIDORDERBYcntDESCLIMIT3"root104www16rabbitmq4[root@iZ2zebfzaequ90bdlz820sZ软件]#ps-ef|q-H-O"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会容易很多。整理了上百本各种技术电子书送给朋友。关注公众号回复【666】自行领取。我和一些朋友建了一个技术交流群,共同探讨技术,分享技术资料,共同学习进步。如果您有兴趣,请加入我们!电子书地址