??????在服務器接口測試中,我們經常會和各種日志打交道。一旦測試時服務端出現了問題,而單憑服務端的日志又不能發現問題原因的時候,往往開發要向我們測試人員詢問客戶端這邊的情況,希望看看我們能不能提供一些有用信息,如錯誤返回內容,錯誤發生時間,哪些用例會出現問題等等。這時就需要我們來查找測試時的日志,從中篩選出有用的信息。
? ? ? 篩查日志這件事,根據情況不同,采用的方法也會有所不同。比如日志很小,至多幾千行這樣的情況,我們完全可以使用一般的文本編輯器打開,直接查找所需內容即可。而像一些“大型”日志,尤其是長時間穩定性測試所產生的日志,動輒可能會有幾個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個時間記錄。
結束語
??????好了,以上就是本期介紹的幾個在日志篩選方面的實用命令,掌握了這些命令,從此可以不再懼怕那些個大文件了。

有任何想說的話,都可以發送內容到“搜狗測試”公眾號,我們一起聊聊~


歡迎添加我們的搜狗測試微信號,與我們一起聊聊測試。