Nginx入門教程(五)---訪問日誌簡單分析,統計PV、UV等資料。

幻境雲圖發表於2020-10-17

本文主要記錄瞭如何對 Nginx 的訪問日誌進行一些簡單的分析。例如分析每日的 PV、UV等指標。

更多內容歡迎訪問我的個人部落格 指月山瀑

1. 概述

Nginx訪問日誌記錄了Nginx的所有請求,預設會儲存在nginx/logs/access.log檔案中,也可以在配置檔案中通過access_log引數自定義存放位置。

如果實在找不到可以通過如下命令查詢

# find / -name "access.log"
/usr/local/nginx/logs/access.log

簡單檢視一些檔案中的內容

less access.log

內容大概是這樣子的

183.69.208.21 - - [16/May/2020:10:04:59 +0000] "GET / HTTP/1.1" 200 4230 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"

主要包含了IP、日期、HTTP Method和協議版本號 狀態碼 裝置資訊等。

本次分析主要用到了awk命令

AWK 是一種處理文字檔案的語言,是一個強大的文字分析工具。可以簡單的理解為一種指令碼語言吧。

2. 具體分析

1. PV數

pv是page view的縮寫,即頁面瀏覽,這裡我們可以簡單的把使用者的每一次請求都看做一次訪問。

於是通過access.log統計PV數就是統計內容的行數了。

具體命令如下:

wc -l access.log

#結果如下
108544 access.log

總PV數大約是108544。

2. 每天的PV數

只需要在PV數的基礎上增加按日期分組即可。

這裡就要用到awk命令了,具體命令如下:

awk '{print substr($4 , 2, 11)}' access.log|\
sort |uniq -c|\
sort -rn|\
head -n 10

#結果如下
   1901 21/May/2020
   1755 23/Jun/2020
   1667 15/Jul/2020
   1620 24/May/2020
   1593 24/Aug/2020
   1579 02/Oct/2020
   1485 16/Oct/2020
   1387 23/May/2020
   1361 29/May/2020
   1274 01/Sep/2020

具體解析:

# AWK 基本語法
# $1 表示第一行內容
awk '{print $1}' access.log

awk '{print substr($4 , 2, 11)}' access.log 這句表示對第四列進行擷取然後列印出來 這裡擷取出來的剛好就是日期
uniq -c 則是計數(記錄重複的有多少個)
sort -rn 排序

3. UV數

UV即Unique visitor,唯一訪客,每個使用者只算一次。

可以簡單的把每個IP當做一個獨立訪客,這樣只需要對於UV我們可以按IP進行分組統計就行了。

awk '{print $1}' access.log |\
sort | uniq |\
wc -l
# 注意 需要先sort在uniq去重,因為uniq只會對相鄰的行進行去重

#結果如下
12354

4. 每天的UV數

同樣的UV基礎上增加按日期分組

awk '{print substr($4,2,11) " " $1}' access.log |\
sort | uniq |\
awk '{uv[$1]++;next}END{for(date in uv) print uv[date] " " date}'|\
sort -rn|\
head -n 10
# head 用於控制顯示多少個head -n 10 即顯示前10

# 結果如下
333 16/Oct/2020
321 12/Oct/2020
321 04/Oct/2020
319 29/May/2020
304 17/Jul/2020
299 05/Aug/2020
294 09/Oct/2020
293 23/Aug/2020
293 07/Oct/2020
290 28/Sep/2020

這次命令稍微複雜了一點點,具體分析如下

# 將日期($4)和IP($1)提取出來重組成新的內容
awk '{print substr($4,2,11) " " $1}' access.log |\
# 排序並去重 這樣統計出來的就是UV了
sort | uniq |\
# 取出每一行的第一列即日期 並將計數+1 最後for迴圈列印出來
awk '{uv[$1]++;next}END{for(date in uv) print uv[date] " " date}'
# 最後在按倒序排序
sort -rn
# 只輸出前10條記錄
head -n 10

5. 統計哪些裝置訪問過

cat access.log |\
awk '{devices[$12]++;next} END {for (d in devices) print devices[d] " " d}'|\
sort -rn|\
head -n 10

# 結果如下
88396 "Mozilla/5.0
9835 "-"
4021 "Mozilla/4.0
1705 
1422 "Go-http-client/1.1"
847 "fasthttp"
759 "Sogou
531 "serpstatbot/1.0
330 "MauiBot
323 "Mozilla"

6. 統計被訪問最多的頁面

cat access.log|\
awk '{print $7}'|sort|uniq -c|\
grep post|\ 
sort -rn|\
head -n 10

# grep post 過濾掉其他記錄 只統計post下的頁面

# 結果如下
    783 /post/etcd/05-watch/
    565 /post/etcd/06-why-mvcc/
    403 /post/etcd/03-v3-analyze/
    354 /post/grpc/00-faq/
    335 /post/elasticsearch/01-install-by-docker/
    285 /post/etcd/04-etcd-architecture/
    253 /post/grpc/04-interceptor/
    231 /post/etcd/01-install/
    230 /post/git/04-git-reduce/
    225 /post/mysql/04-cap-lock/

3. 小結

主要用到了以下幾個命令

  • wc 統計檔案內容行數、字數、位元組數
    • -l 只統計行數
  • cat 檢視檔案內容
    • 會一次性載入出所有內容,不建議用在大檔案上
    • ls -h 先檢視檔案大小
  • awk文字分析工具
  • sort 排序
    • 預設升序 -r引數指定降序
    • 預設按字元排序(該情況下2>10 因為 2>1) -n 引數指定按照數值大小排序
  • grep過濾
    • 支援正規表示式
  • uniq 去重
    • 大部分情況下需要和sort配合使用
  • head 控制輸出行數
    • 和sort配合可以只輸出topn
  • 管道操作符 |
    • 通過該命令可以將一個命令的輸出作為另一個命令的輸出 非常常用

相關文章