日誌中包含了程序在遇到異常狀況所打印的堆棧信息,訪間用戶IP地址、請求url、應用響應時間、內存垃圾回收信息,以及系統開發者在系統運行過程當中想打印的任何信息。經過異常堆棧,能夠定位到依賴的誰宕機了,產生問題的程序bug的行,對異常進行修復;經過訪問IP和請求url和參數,排查是否遭到攻擊,以及攻擊的形式;經過應用的響應時間、垃圾回收,以及系統load來判斷系統負載,是否須要增長機器;經過線程dump,判斷是否死鎖及線程阻塞的緣由;經過應用的GC (Garbage Collection, 即內存回收)日誌,對系統代碼和JVM內存參數進行優化,減小GC次數與stop the world時間,優化應用響應時間。正則表達式
而想要經過日誌分析得出系統產生問題的緣由,首先咱們須要熟悉日誌分析的相關命令和腳本從日誌中篩選出有價值的內容編程
若是日誌文件較小能夠直接用cat命令打印出來,若是日誌文件較大請不要這樣作,打開一個過大的文件可能會佔用大量的系統資源,從而影響系統的對外服務服務器
cat 文件名 less
cat -n 文件名 能夠查看行號curl
cat缺點在於:一旦執行沒法進行交互和控制,more能夠分頁的展現文件工具
按Enter鍵顯示文件下一行
按空格鍵即是下一頁
F鍵顯示下一屏內容
B鍵顯示下一屏內容
另外一個 less 命令在於它能夠支持內容查找優化
輸入/user便可url
由於日誌通常都是以追加的形式寫入的,新寫的內容通常都在文件末尾處spa
-n 參數後跟的數字表示顯示文件最後幾行,若是爲4則顯示文件最後四行命令行
-f 可讓程序不退出,而且持續的顯示文件新增的行
與tail相似
sort默認是按照字符串順序排序的
-n 按照數字排序
-r 按照逆序排列
-k 指定排序的列
-t 指定列分隔符
實例:
先cat一下咱們的文件,能夠看到數字是無序的
咱們使用 sort -n 和 sort -n -r 能夠發現文件進行了一次增序和降序的排序
爲了熟悉 -k 和 -t 我本身寫了一個例子
一樣是先cat一下文件,咱們的目的是要根據第二列的數字進行排序
咱們就能夠輸入 sort -k 2 -t ' ' -n b.txt ,就是對第二列的數據進行排序,經過空格來區分列
wc -l 查看文件的行數
wc -c 查看文件包含的字節數
wc -L 查看文件中最長的行的長度
wc -w 查看文件中有多少個單詞
uniq能夠用來顯示文件中行重複的個數,或者顯示僅出現一次的行,以及僅僅顯示重複的行
uniq去重針對的僅是連續的兩行,所以他常常和sort一塊兒用
以上是文件內容
經過sort排序,再經過uniq去重統計
-c 在每行前加上出現的次數
-u 顯示只出現一次的行
-d 展現出現重複的 行
grep 能夠查找文件中符合條件的字符串,若是文件內容符合就會把這行打印
grep -c 顯示查找到的行號
grep的查找也支持正則表達式例如查找u開頭r結尾的字符串
若是隻知道文件名稱不知道,文件路徑那咱們就須要 find 命令了
咱們也能夠查找以txt結尾的文件
咱們還可使用find命令遞歸的打印當前目錄
find . -print
實際操做中,嚐嚐須要對錶達式進行求值,使用expr指令,可以對運算表達式或者字符串進行運算求值
注意:乘法運算時須要用反斜槓(\)對 *進行轉義
想在命令行下經過http協議訪問網頁文檔,就要用到 curl 工具,它支持HTTP,HTTPS,FTP,Telnet等多種協議,常被用來在命令行下抓取網頁和監控Web服務器狀態
這裏僅簡單的介紹他一些經常使用的用法好比發起網頁請求
加上 -i 返回帶header的文檔
-I 只返回header信息
單條命令仍是沒法成氣候的,須要將命令組合起來來使用纔會更有效率
好比說咱們的日誌是這樣的(數據都是僞造的)
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
查找訪問量前五的ip地址
cat access.log |cut -f1 -d " " | sort | uniq -c | sort -k 1 -n -r | head -5
cat access.log |sort -k 5 -n -r | head -10
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的一些簡單功能,若是要所有掌握就得本身找資料去了解了,但這些簡單的功能也足夠讓咱們看出他的強大