在分析nginx日志時常用命令總結【轉】


1. 利用grep ,wc命令統計某個請求或字符串出現的次數

比如統計GET /app/kevinContent接口在某天的調用次數,則可以使用如下命令:
[root@Fastdfs_storage_s1 ~]# cat /usr/local/nginx/logs/access.log | grep 'GET /app/kevinContent' | wc -l
 
其中cat用來讀取日志內容,grep進行匹配的文本搜索,wc則進行最終的統計。
當然只用grep也能實現上述功能:
[root@Fastdfs_storage_s1 ~]# grep 'GET /app/kevinContent'  /usr/local/nginx/logs/access.log -c
 
2. 統計所有接口的調用次數並顯示出現次數最多的前二十的URL
 
[root@Fastdfs_storage_s1 ~]# cat /usr/local/nginx/logs/access.log|awk '{split($7,b,"?");COUNT[b[1]]++;}END{for(a in COUNT) print  COUNT[a], a}'|sort -k1 -nr|head -n20
 
2722 /
10 /group1/M00/00/00/wKgKylqT3OCAUrqYAAAwK2jUNaY262.png
9 /group1/M00/00/00/wKgKylqUxBOAFo8hAAKHUIZ3K9s443.jpg
6 /group1/M00/00/00/wKgKylqUrceAGkPOAAAwK2jUNaY843.png
4 /group1/M00/00/00/wKgKylqTsFCAdeEuAAKHUIZ3K9s287.png
3 /group2/M00/00/00/wKgKy1qUtu2Acai1AAKHUIZ3K9s555.jpg
2 /favicon.ico
1 /group2/M00/00/00/wKgKy1qT3P-Ae-vQAAKHUIZ3K9s459.png
1 /group2/M00/00/00/wKgKy1qT3P-Ae-vQAAKHUIZ3K9s459.jpg
1 /group1/M00/00/00/wKgKylqUyMuAdkLwAAAwK2jUNaY176.png
1 /group1/M00/00/00/wKgKylqUtuyAA5xrAAKHUIZ3K9s226.jpg
1 /group1/M00/00/00/wKgKylqUscKAa4NXAAKHUIZ3K9s530.jpg
1 /group1/M00/00/00/wKgKylqTsFCAdeEuAAKHUIZ3K9s287.jpg
1 /group1/M00/00/00/wKgKylqT4ESAHdNjAAKHUIZ3K9s730.jpg
1 /group1/M00/00/00/wKgKylqT3-6AbEeUAAKHUIZ3K9s742.png

解釋說明:
這里 awk 是按照空格把每一行日志拆分成若干項,其中$7對應的就是URL,當然具體對應的內容和使用nginx時設置的日志格式有關。
這樣就可以通過拆分提取出IP,URL,狀態碼等信息。 split awk 的內置函數,在此的意思是按照“?”將URL進行分割得到一個數組,並賦值給b。
COUNT[b[1]]++表示相同的接口數目加1。 sort 用來排序,-k1nr表示要把進行排序的第一列作為數字看待,並且結果倒序排列。
head -n20意為取排名前二十的結果。
 

3. 統計報錯的接口 

 
統計nginx日志中報錯較多的接口,對於分析服務器的運行情況很有幫助,也可以有針對性的修復bug和性能優化。
[root@Fastdfs_storage_s1 ~]# cat /usr/local/nginx/logs/access.log|awk '{if($9==500) print $0}'|awk '{split($7,b,"?");COUNT[b[1]]++;}END{for(a in COUNT) print  COUNT[a], a}'|sort -k 1 -nr|head -n10
 
先用awk’{if(9==500)print0}’過濾出500錯誤的日志,然后在此基礎上做統計,其思路同2類似!

 

4. 統計HTTP響應狀態碼
通過統計響應狀態碼可以看出服務器的響應情況,比如499較多時可以判斷出服務器響應緩慢,再結合3可以找出響應慢的接口,
這樣就能有針對性進行性能分析和優化。

[root@Fastdfs_storage_s1 ~]# cat /usr/local/nginx/logs/access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}'| sort -k 2 -nr
200 2733
304 20
404 11

5. 統計服務器並發量

[root@Fastdfs_storage_s1 ~]# cat /usr/local/nginx/logs/access.log |grep '10.15.19.138'| awk '{COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}'
|sort -k 2 -nr|head -n20
 
nginx轉發請求時可以記錄響應請求的服務器IP,先通過grep過濾出某個服務器所有的請求,然后統計各個時間點的並發請求響應的數量即可得到某個服務器的並發量。
$4對應的是響應時間。當然,如果把grep的內容更換成某個接口也就可以統計出該接口對應的並發量了。

 

6. grep多條件與或操作

有時候我們需要在nginx日志通過多個條件來查找某些特定請求,比如我需要找個某個用戶瀏覽文章的請求,則可以需要同時匹配兩個條件:
瀏覽文章接口GET /app/kevinContent和userId=59h7hrrn。

grep對應的與操作命令如下:
[root@Fastdfs_storage_s1 ~]# grep -E "GET /app/kevinContent.*userId=59h7hrrn" /usr/local/nginx/logs/access.log
 
grep與命令格式: grep -E “a.*b” file,ab條件同時成立
而grep或命令的格式為:grep -E “a|b” file ,ab兩個條件有一個成立即可。

 

7. grep打印匹配的前后幾行

有時候我們需要查找某個特定請求的前后幾行的請求,以觀察用戶的關聯操作情況。grep提供了一下幾條命令:
# grep -C 5 'parttern' inputfile    //打印匹配行的前后5行。
# grep -A 5 'parttern' inputfile    //打印匹配行的后5行
# grep -B 5 'parttern' inputfile    //打印匹配行的前5行

grep -An  或grep -A n
grep -Bn  或grep -B n
grep -Cn  或grep -C n

如下,打印出access.log日志文件中匹配 /app/kevinContent 關鍵字符所在行的前后各10行
[root@Fastdfs_storage_s1 ~] # grep -C 10 'GET /app/kevinContent' /usr/local/nginx/logs/access.log

 

 轉自

針對Nginx日志的相關運維操作記錄 - 散盡浮華 - 博客園 https://www.cnblogs.com/kevingrace/p/8483089.html

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM