沒想到,日誌還能這麼分析!

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

不少時候,咱們觀察程序是否如期運行,或者是否有錯誤,最直接的方式就是看運行日誌,固然要想從日誌快速查到咱們想要的信息,前提是程序打印的日誌要精煉、精準。nginx

但日誌涵蓋的信息遠不止於此,好比對於 nginx 的 access.log 日誌,咱們能夠根據日誌信息分析用戶行爲。瀏覽器

什麼用戶行爲呢?好比分析出哪一個頁面訪問次數(PV)最多,訪問人數(UV)最多,以及哪天訪問量最多,哪一個請求訪問最多等等。服務器

此次,將用一個大概幾萬條記錄的 nginx 日誌文件做爲案例,一塊兒來看看如何分析出「用戶信息」。less

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

別急着開始

當咱們要分析日誌的時候,先用 ls -lh 命令查看日誌文件的大小,若是日誌文件大小很是大,最好不要在線上環境作。ide

好比我下面這個日誌就 6.5M,不算大,在線上環境分析問題不大。函數

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

若是日誌文件數據量太大,你直接一個 cat 命令一執行,是會影響線上環境,加劇服務器的負載,嚴重的話,可能致使服務器無響應。工具

當發現日誌很大的時候,咱們可使用 scp 命令將文件傳輸到閒置的服務器再分析,scp 命令使用方式以下圖:操作系統

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

慎用 cat

你們都知道 cat 命令是用來查看文件內容的,可是日誌文件數據量有多少,它就讀多少,很顯然不適用大文件。3d

對於大文件,咱們應該養成好習慣,用 less 命令去讀文件裏的內容,由於 less 並不會加載整個文件,而是按需加載,先是輸出一小頁的內容,當你要往下看的時候,纔會繼續加載。日誌

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

能夠發現,nginx 的 access.log 日誌每一行是一次用戶訪問的記錄,從左到右分別包含以下信息:

  • 客戶端的 IP 地址;

  • 訪問時間;

  • HTTP 請求的方法、路徑、協議版本、協議版本、返回的狀態碼;

  • User Agent,通常是客戶端使用的操做系統以及版本、瀏覽器及版本等;

不過,有時候咱們想看日誌最新部分的內容,可使用 tail 命令,好比當你想查看倒數 5 行的內容,你可使用這樣的命令:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

若是你想實時看日誌打印的內容,你可使用 tail -f 命令,這樣你看日誌的時候,就會是阻塞狀態,有新日誌輸出的時候,就會實時顯示出來。


PV  分析

PV 的全稱叫 Page View,用戶訪問一個頁面就是一次 PV,好比大多數博客平臺,點擊一次頁面,閱讀量就加 1,因此說 PV 的數量並不表明真實的用戶數量,只是個點擊量。

對於 nginx 的 acess.log 日誌文件來講,分析 PV 仍是比較容易的,既然日誌裏的內容是訪問記錄,那有多少條日誌記錄就有多少 PV。

咱們直接使用 wc -l 命令,就能夠查看總體的 PV 了,以下圖一共有 49903 條 PV。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

PV 分組

nginx 的 acess.log 日誌文件有訪問時間的信息,所以咱們能夠根據訪問時間進行分組,好比按天分組,查看天天的總 PV,這樣能夠獲得更加直觀的數據。

要按時間分組,首先咱們先「訪問時間」過濾出來,這裏可使用 awk 命令來處理,awk 是一個處理文本的利器。

awk 命令默認是以「空格」爲分隔符,因爲訪問時間在日誌裏的第 4 列,所以可使用 awk '{print $4}' access.log 命令把訪問時間的信息過濾出來,結果以下:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

上面的信息還包含了時分秒,若是隻想顯示年月日的信息,可使用 awk 的 substr 函數,從第 2 個字符開始,截取 11 個字符。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

接着,咱們可使用 sort 對日期進行排序,而後使用 uniq -c 進行統計,因而按天分組的 PV 就出來了。

能夠看到,天天的 PV 量大概在 2000-2800:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

注意,使用 uniq -c 命令前,先要進行 sort 排序,由於 uniq 去重的原理是比較相鄰的行,而後除去第二行和該行的後續副本,所以在使用 uniq 命令以前,請使用 sort 命令使全部重複行相鄰。


UV 分析

UV 的全稱是 Uniq Visitor,它表明訪問人數,好比公衆號的閱讀量就是以 UV 統計的,無論單個用戶點擊了多少次,最終只算 1 次閱讀量。

access.log 日誌裏雖然沒有用戶的身份信息,可是咱們能夠用「客戶端 IP 地址」來近似統計 UV。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

該命令的輸出結果是 2589,也就說明 UV 的量爲 2589。上圖中,從左到右的命令意思以下:

  • awk '{print $1}' access.log,取日誌的第 1 列內容,客戶端的 IP 地址正是第 1 列;

  • sort,對信息排序;

  • uniq,去除重複的記錄;

  • wc -l,查看記錄條數;


UV 分組

假設咱們按天來分組分析天天的 UV 數量,這種狀況就稍微比較複雜,須要比較多的命令來實現。

既然要按天統計 UV,那就得把「日期 + IP地址」過濾出來,並去重,命令以下:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

具體分析以下:

  • 第一次 ack 是將第 4 列的日期和第 1 列的客戶端 IP 地址過濾出來,並用空格拼接起來;

  • 而後 sort 對第一次 ack 輸出的內容進行排序;

  • 接着用 uniq 去除重複的記錄,也就說日期 +IP 相同的行就只保留一個;

上面只是把 UV 的數據列了出來,可是並無統計出次數。

若是須要對當天的 UV 統計,在上面的命令再拼接 awk '{uv[$1]++;next}END{for (ip in uv) print ip, uv[ip]}' 命令就能夠了,結果以下圖:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

awk 自己是「逐行」進行處理的,當執行完一行後,咱們能夠用 next 關鍵字來告訴 awk 跳轉到下一行,把下一行做爲輸入。

對每一行輸入,awk 會根據第 1 列的字符串(也就是日期)進行累加,這樣相同日期的 ip 地址,就會累加起來,做爲當天的 uv 數量。

以後的 END 關鍵字表明一個觸發器,就是當前面的輸入所有完成後,纔會執行 END {} 中的語句,END 的語句是經過 foreach 遍歷 uv 中全部的 key,打印出按天分組的 uv 數量。


終端分析

nginx 的 access.log 日誌最末尾關於 User Agent 的信息,主要是客戶端訪問服務器使用的工具,多是手機、瀏覽器等。

所以,咱們能夠利用這一信息來分析有哪些終端訪問了服務器。

User Agent 的信息在日誌裏的第 12 列,所以咱們先使用 awk 過濾出第 12 列的內容後,進行 sort 排序,再用 uniq -c 去重並統計,最後再使用 sort -rn(r 表示逆向排序, n 表示按數值排序) 對統計的結果排序,結果以下圖:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

分析 TOP3 的請求

access.log 日誌中,第 7 列是客戶端請求的路徑,先使用 awk 過濾出第 7 列的內容後,進行 sort 排序,再用 uniq -c 去重並統計,而後再使用 sort -rn 對統計的結果排序,最後使用 head -n 3 分析 TOP3 的請求,結果以下圖:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

-

相關文章
相關標籤/搜索