在服务器接口测试中,我们经常会和各种日志打交道。一旦测试时服务端出现了问题,而单凭服务端的日志又不能发现问题原因的时候,往往开发要向我们测试人员询问客户端这边的情况,希望看看我们能不能提供一些有用信息,如错误返回内容,错误发生时间,哪些用例会出现问题等等。这时就需要我们来查找测试时的日志,从中筛选出有用的信息。
筛查日志这件事,根据情况不同,采用的方法也会有所不同。比如日志很小,至多几千行这样的情况,我们完全可以使用一般的文本编辑器打开,直接查找所需内容即可。而像一些“大型”日志,尤其是长时间稳定性测试所产生的日志,动辄可能会有几个g,几十g,再用编辑器打开显然不够现实。这时,我们可以采用其他的一些查找方法,在不打开日志文件的情况下,较为快速地进行筛选。下面我就来说说几个经常会使用到的命令(方法)。
一、more/less 命令
more和less命令在使用上十分相近,都是用分页查看文本的方式,每次只显示一定行的文本,避免像cat那样被大量的文字快速刷屏,同时支持搜索,可以在文件中搜索某个关键词并实现定位。more和less有一些细微不同的地方,体现在参数设置上。总体而言,less似乎更适合对于日志的筛查,可以进行向前或向后双方向的搜索,并且可以按方向键逐行前后滚动,而more只支持向后查找和向后翻页或滚动。
基本命令格式:
more/less example.log
搜索关键词方法:
输入命令后按"/",输入关键词后回车即可定位至关键词第一次出现的位置,此时按n键可切换至下一次出现的位置,使用less时,按N(shift或大写锁定+n)键返回上一次出现的位置。
优点:
可以自动定位关键词出现的位置,并显示关键词前后的文本内容,使用起来比较方便。
缺点:
搜索速度较慢,文件特别大的话要等很久才能搜索到。
应用举例:
查看日志文件从某时刻开始的内容
首先使用more命令打开一个日志文件
more 2019-08-05_1.csv
显示结果如下:
可以看到日志的内容很多,此时我们关注日志中的时间,比如我想查看从04:01:00 GMT开始的日志,那么就键盘输入:
/04:01
按下回车,就会自动切换至我们想要的位置:
可以看到,日志内容从04:01开始了。
二、grep 命令
grep命令是linux下最好用的命令之一。grep用来筛选内容的速度应该是最快的,这点没有之一,大到几个g的文件,几秒就可以完成对单一关键词的筛取,可谓是查找大文件的“神器”,而且grep命令格式十分简单,常用的搜索功能只需三个参数即可完成。
基本命令格式:
grep keyword example.log
搜索关键词方法:
在keyword位置设置想要搜索的关键词,按下回车,即可将所有包含该关键词的行显示出来。
优点:
快速,可批量筛选出含有关键词的全部文本行。
缺点:
如果关键词在文本中出现较多,无法快速定位至某一次关键词出现的位置,依然会出现刷屏效果。
拓展应用:
在命令中添加-A,-B,-C参数,可分别获取某关键词出现位置后面、前面、前后n行的内容:
grep -A|B|C n keyword example.log
应用举例:
查看日志文件某时刻起向后10行的内容
使用如下命令:
grep -A 10 '04:01:41' 2019-08-05_1.csv
结果显示:
可以看到,从日志中成功筛选出了04:01:41 GMT时刻后面10行的日志内容,比more/less命令搜索速度快了不少,而且内容更加简洁,只包含这部分的内容信息。
三、head/tail 命令
head和tail命令是功能近似而作用位置相反的两个命令,head命令用来从开头读取文本,tail命令则是从尾部读取文本。当我们不关注日志中间的一大坨内容,只关注开头或结尾的部分内容时,head和tail命令可以说是最好的解决方案。
基本命令格式:
head/tail -n example.log
使用方法:
设置需要从文件开头/结尾查找的行数(n),即可显示对应结果。
优点:
方便实用,尤其是tail,可以从尾部读取文件。
缺点:
单独使用不能查找关键词。
拓展应用:
1、head/tail与grep命令结合使用
如果需要从文件开头或结尾一定范围内查找关键词,那么head/tail与grep结合使用就再方便不过了,使用管道符连接两个命令即可:
head/tail -n example.log | grep keyword
反过来,也可以获取含有某关键词所有行中的前/后n个:
grep keyword example.log | head/tail -n
2、tail -f 命令
在测试过程中,我们有时可能需要监测一下当前日志的输出情况,而由于日志在测试程序启动时已经定向到了某个文件,没有给到标准输出,这时我们可以使用tail -f这个十分简便的命令,获取和日志“上屏”相似的效果,随着日志文件的不断更新,该命令也会将更新的内容给到标准输出,同时不影响日志文件的记录:
tail -f example.log
此外,该命令结合grep使用,更可以获得实时筛选日志信息的功能,将简化版、筛取版的日志记录或输出。
应用举例:
查看日志文件前1000行中,测试的时间记录
使用如下命令:
head -1000 2019-08-05_1.csv | grep date
结果显示:
可以看到,这样准确从日志中筛选出了时间记录。
如此,我们还可以进一步拓展命令,利用wc -l来统计时间记录的个数,完整命令如下:
head -1000 2019-08-05_1.csv | grep date | wc -l
结果显示:
可以看到,一共有31个时间记录。
结束语
好了,以上就是本期介绍的几个在日志筛选方面的实用命令,掌握了这些命令,从此可以不再惧怕那些个大文件了。
有任何想说的话,都可以发送内容到“搜狗测试”公众号,我们一起聊聊~
欢迎添加我们的搜狗测试微信号,与我们一起聊聊测试。