日志中包含了程序在遇到異常情況所打印的堆棧信息,訪間用戶IP地址、請求url、應用響應時間、內存垃圾回收信息,以及系統開發者在系統運行過程中想打印的任何信息。通過異常堆棧,可以定位到依賴的誰宕機了,產生問題的程序bug的行,對異常進行修復;通過訪問IP和請求url和參數,排查是否遭到攻擊,以及攻擊的形式;通過應用的響應時間、垃圾回收,以及系統load來判斷系統負載,是否需要增加機器;通過線程dump,判斷是否死鎖及線程阻塞的原因;通過應用的GC (Garbage Collection, 即內存回收)日志,對系統代碼和JVM內存參數進行優化,減少GC次數與stop the world時間,優化應用響應時間。
而想要通過日志分析得出系統產生問題的原因,首先我們需要熟悉日志分析的相關命令和腳本從日志中篩選出有價值的內容
1.常見命令
cat命令查看文件內容
如果日志文件較小可以直接用cat命令打印出來,如果日志文件較大請不要這樣做,打開一個過大的文件可能會占用大量的系統資源,從而影響系統的對外服務
cat 文件名
cat -n 文件名 可以查看行號
more和less分頁顯示文件
cat缺點在於:一旦執行無法進行交互和控制,more可以分頁的展示文件
按Enter鍵顯示文件下一行
按空格鍵便是下一頁
F鍵顯示下一屏內容
B鍵顯示下一屏內容
另一個 less 命令在於它可以支持內容查找
輸入/user即可
tail查看文件尾
因為日志一般都是以追加的形式寫入的,新寫的內容一般都在文件末尾處
-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的一些簡單功能,如果要全部掌握就得自己找資料去了解了,但這些簡單的功能也足夠讓我們看出他的強大