日誌分析常見命令

  日誌中包含了程序在遇到異常狀況所打印的堆棧信息,訪間用戶IP地址、請求url、應用響應時間、內存垃圾回收信息,以及系統開發者在系統運行過程當中想打印的任何信息。經過異常堆棧,能夠定位到依賴的誰宕機了,產生問題的程序bug的行,對異常進行修復;經過訪問IP和請求url和參數,排查是否遭到攻擊,以及攻擊的形式;經過應用的響應時間、垃圾回收,以及系統load來判斷系統負載,是否須要增長機器;經過線程dump,判斷是否死鎖及線程阻塞的緣由;經過應用的GC (Garbage Collection, 即內存回收)日誌,對系統代碼和JVM內存參數進行優化,減小GC次數與stop the world時間,優化應用響應時間。正則表達式

  而想要經過日誌分析得出系統產生問題的緣由,首先咱們須要熟悉日誌分析的相關命令和腳本從日誌中篩選出有價值的內容編程

1.常見命令

cat命令查看文件內容

若是日誌文件較小能夠直接用cat命令打印出來,若是日誌文件較大請不要這樣作,打開一個過大的文件可能會佔用大量的系統資源,從而影響系統的對外服務服務器

 cat 文件名  less

cat -n 文件名 能夠查看行號curl

 more和less分頁顯示文件

cat缺點在於:一旦執行沒法進行交互和控制,more能夠分頁的展現文件工具

按Enter鍵顯示文件下一行

按空格鍵即是下一頁

F鍵顯示下一屏內容

B鍵顯示下一屏內容

另外一個 less 命令在於它能夠支持內容查找優化

 輸入/user便可url

tail查看文件尾

由於日誌通常都是以追加的形式寫入的,新寫的內容通常都在文件末尾處spa

 -n 參數後跟的數字表示顯示文件最後幾行,若是爲4則顯示文件最後四行命令行

 -f 可讓程序不退出,而且持續的顯示文件新增的行

 head查看文件頭

與tail相似

 sort 內容排序

sort默認是按照字符串順序排序的

 -n 按照數字排序

 -r 按照逆序排列

 -k 指定排序的列

 -t 指定列分隔符

實例:

先cat一下咱們的文件,能夠看到數字是無序的

 咱們使用 sort -n  和 sort -n -r 能夠發現文件進行了一次增序和降序的排序 

 爲了熟悉 -k  和 -t 我本身寫了一個例子

一樣是先cat一下文件,咱們的目的是要根據第二列的數字進行排序

 咱們就能夠輸入 sort -k 2 -t ' ' -n b.txt ,就是對第二列的數據進行排序,經過空格來區分列

 wc字符統計

 wc -l 查看文件的行數

wc -c 查看文件包含的字節數

 wc -L 查看文件中最長的行的長度

 wc -w 查看文件中有多少個單詞

uniq 查出重複的行

uniq能夠用來顯示文件中行重複的個數,或者顯示僅出現一次的行,以及僅僅顯示重複的行

uniq去重針對的僅是連續的兩行,所以他常常和sort一塊兒用

 以上是文件內容

經過sort排序,再經過uniq去重統計

 -c 在每行前加上出現的次數

 -u 顯示只出現一次的行

 -d 展現出現重複的 行

grep字符串查找

  grep 能夠查找文件中符合條件的字符串,若是文件內容符合就會把這行打印

   grep -c  顯示查找到的行號

grep的查找也支持正則表達式例如查找u開頭r結尾的字符串

find文件查找

若是隻知道文件名稱不知道,文件路徑那咱們就須要 find 命令了

 咱們也能夠查找以txt結尾的文件

 咱們還可使用find命令遞歸的打印當前目錄

 find . -print 

 expr表達式求值

實際操做中,嚐嚐須要對錶達式進行求值,使用expr指令,可以對運算表達式或者字符串進行運算求值

注意:乘法運算時須要用反斜槓(\)對 *進行轉義

 

 

 URL訪問工具

想在命令行下經過http協議訪問網頁文檔,就要用到 curl 工具,它支持HTTP,HTTPS,FTP,Telnet等多種協議,常被用來在命令行下抓取網頁和監控Web服務器狀態

這裏僅簡單的介紹他一些經常使用的用法好比發起網頁請求

 

 加上 -i 返回帶header的文檔

  -I 只返回header信息

 

2.實際需求

單條命令仍是沒法成氣候的,須要將命令組合起來來使用纔會更有效率

好比說咱們的日誌是這樣的(數據都是僞造的)

 

174.119.232.29 GET www.xxx1.com 404 12312
174.119.232.29 GET www.xxx2.com 200 657
174.119.124.30 GET www.xxx1.com 500 123
174.119.232.30 GET www.xxx3.com 200 1421
174.119.232.30 GET www.xxx4.com 301 4554
174.646.232.29 GET www.xxx4.com 404 45
174.546.232.29 GET www.xxx2.com 302 123
174.453.232.34 GET www.xxx1.com 303 4345
174.119.232.29 GET www.xxx5.com 404 753
174.123.232.29 GET www.xxx1.com 404 78678
174.119.232.36 GET www.xxx5.com 400 764
174.546.232.29 GET www.xxx8.com 200 43
174.546.232.29 GET www.xxx3.com 200 123
174.567.232.78 GET www.xxx2.com 200 786
174.119.232.29 GET www.xxx5.com 404 786
174.119.232.83 GET www.xxx7.com 404 7673
174.453.232.72 GET www.xxx1.com 200 37
174.119.232.50 GET www.xxx9.com 404 767
174.534.232.96 GET www.xxx1.com 200 112

1.查看請求訪問量

查找訪問量前五的ip地址

cat access.log |cut -f1 -d " " | sort | uniq -c | sort -k 1 -n -r | head -5

2.查看最耗時最多的頁面

cat access.log |sort -k 5 -n -r | head -10

2.awk程序

awk可以提供一個相似於編程的開放環境,可以讓你自定義文本處理的規則,修改和從新組織文件中的內容

awk通用格式:

 awk [option] 'pattern {action}' file 

option: 命令的選項

pattern:行匹配規則

action: 具體執行的操做

file: 文件

若是沒有pattern,則對全部行執行action,而若是沒有action,則打印全部行

例如:

1.打印文件指定的列

 awk '{print $1}' access.log | head -10 

 

 awk 默認用空格將一行分割成多個列,能夠用 -F 指定列的分隔符

2.使用/xxx1/查找包含xxx1的行,並打印3,4列

 awk '/xxx1/{print $3,$4}' access.log |head -10 

 3.查找length大於等於40的行,並打印他的第5列

 awk 'length($0)>=40{print $5}' access.log |head -5 

$0表明當前行,length($0)即當前行長度 

4.對內容進行格式化輸出

 awk '{line=sprintf("methodType:%s,responseCode:%s,responseTime:%s", $2,$4,$5);print line}' access.log |head -10  

 定義一個line的變量,用於接收sprintf的輸出,打印line

 

awk最厲害的一點即是支持編程的方式來處理文本,咱們能夠簡單操做一下

1.建立一個文件

2.將以前的命令拷到裏面去

 3.經過 -f 咱們能夠指定包含文本處理程序的腳本文件(因爲靈活的編程功能,因此提供了無限的擴展空間)

 4. awk -f script access.log |head -10 

 

 固然這裏也就是簡單的介紹了awk的一些簡單功能,若是要所有掌握就得本身找資料去了解了,但這些簡單的功能也足夠讓咱們看出他的強大

相關文章
相關標籤/搜索