1. 程式人生 > >nginx日誌分析利器GoAccess

nginx日誌分析利器GoAccess

面試的時候一定會被面到的問題是:給出web伺服器的訪問日誌,請寫一個指令碼來統計訪問前10的IP有哪些?訪問前10的請求有哪些?當你領略過goaccess之後,你就明白,這些問題,除了考驗你的指令碼背誦記憶能力以外,唯一的作用只有裝A或者裝C了。

對於nginx日誌分析,有很多工具,衡量好壞的標準大概就是三快:安裝快,解析快,上手快。滿足這三點的goaccess確實是居家必備良藥。

話說這個標題其實有點委屈GoAccess了,它是一個日誌分析工具,並不只是為nginx使用的。你也可以用它來分析apache,IIS的日誌,甚至你自己寫的web服務,當然前提是你需要定義好解析的日誌格式。誠如見到一個美女,你會一眼喜歡上它的幾個功能有:

1 解析速度快

2 使用簡單

3 能生成html,json,csv

安裝GoAccess

如果你是centos,使用yum:

yum install goaccess

如果你的yum找不到goaccess,就先安裝epel

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm

GoAccess有兩種使用方法,一種是直接在控制檯顯示和操作。

當你要立馬分析出今天早上10點到12點的IP訪問情況的時候,直接在控制檯敲命令是最快的。

另外一種就是生成html檔案或者資料檔案。

如果你希望每天管理的伺服器叢集能給你傳送一個昨天訪問日誌的情況,這個就是不二選擇了。

編譯安裝:

[[email protected] tar_gz]# wget -c http://tar.goaccess.io/goaccess-0.8.5.tar.gz
[[email protected] tar_gz]# tar zxvf goaccess-0.8.5.tar.gz
[[email protected]

tar_gz]# cd goaccess-0.8.5
[[email protected] goaccess-0.8.5]# ./configure
[[email protected] goaccess-0.8.5]# make && make install
我這裡web伺服器為nginx。
可以直接輸入goaccess -f +日誌路徑 進入控制檯,操作不多說,百度一大片。

控制檯使用GoAccess

goaccess的引數:

-f <input-file> : 需要解析的日誌檔案

-a --agent-list : 在host模組是不是能點選IP出現這個IP的user-agentlist,就是出現如圖的功能

Image

-c --conf-dialog: 是否顯示log和format配置對話視窗。

就是下面的這個視窗

Image(1)

這個視窗有很多可以研究的。

首先,goaccess支援的日誌格式有哪些?

Common Log Format (CLF)

通用日誌格式,例子:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

主機   使用者身份 作者 [日期] "請求方法  請求路徑 請求協議" 狀態碼 位元組數

 NCSA Commbined Log Format

這個是Common Log Format的擴充套件,例子:

125.125.125.125 - dsmith [10/Oct/1999:21:15:05 +0500] "GET /index.html HTTP/1.0" 200 1043 "http://www.ibm.com/" "Mozilla/4.05 [en] (WinNT; I)" "USERID=CustomerA;IMPID=01234"

主機 使用者身份 作者 [日期] "請求方法 請求路徑 請求協議" 狀態碼 位元組數 referrer 客戶端代理 cookie

 W3C

IIS 4.0和5.0是使用這種格式的,例子如下:

複製程式碼
#Software: Microsoft Internet Information Server 4.0

#Version: 1.0

#Date: 1998-11-19 22:48:39

#Fields: date time c-ip cs-username s-ip cs-method cs-uri-stem cs-uri-query sc-status sc-bytes cs-bytes time-taken cs-version cs(User-Agent) cs(Cookie) cs(Referrer)

1998-11-19 22:48:39 206.175.82.5 - 208.201.133.173 GET /global/images/navlineboards.gif - 200 540 324 157 HTTP/1.0 Mozilla/4.0+(compatible;+MSIE+4.01;+Windows+95) USERID=CustomerA;+IMPID=01234 http://yourturn.rollingstone.com/[email protected]@webx1.html
複製程式碼

 CloudFront

AWS上的日誌格式

自定義格式

關於自定義格式所設定的引數說明在這裡

-d --with-output-resolver 在HTML輸出或者json輸出中開啟IP 解析

如果開啟了-d,goaccess就會使用GEOIP來進行IP解析。

-e --exclude-ip=<ip address>

Host模組中不需要被統計的IP,比如可以將爬蟲的IP過濾掉

-h --help 幫助文件

-H --http-protocol 顯示的時候是否帶上HTTP協議資訊

-m --with-mouse 控制面板開啟支援滑鼠點選,帶上了m之後,雙擊滑鼠就相當於回車的操作

-M --http-method 是否帶上HTTP方法資訊

-H和-M帶上之後效果為:

Image(2)

-o --output-format=csv|json 輸出為csv或者json形式

-p --conf-file=<filename>

指定配置檔案,如果你有配置檔案,配置檔案中又恰巧設定了log-format和date,那麼你就不會被強制進入到format對話方塊了。如果你沒有設定的話,預設使用~/.goacessrc。

-q --no-query-string

忽略請求的引數部分

-r --no-term-resolver

在Host模組中是否進行IP的解析。加上-r是禁止IP解析。

--no-color

輸出無顏色標示

--real-os

展示真實的作業系統。在Operation System模組中,是否展示更詳細的作業系統資訊。

如圖:

Image(3)

下面說說的是控制檯的鍵盤操作:

F1是開啟幫助文件

F5是重新整理當前視窗

q是退出當前視窗,直到退出程式

o是進入選擇條目

0-9 是選擇模組

tab和shift+tab是在前後模組之前切換

j和k是在模組內部條目切換

s是模組內部條目排序方式

ps:模組切換在右上角有當前模組的標示

使用GoAccess生成檔案

說起GoAccess最讓你爽的就是能生成html了,然後每天就可以看個統計報表。

下面的命令能生成html頁面:

goaccess -d -f web.log -a -p /home/yejianfeng/.goaccessrc > test.html

生成的html的截圖如下:

Image(5)

也可以生成json:

goaccess -q -f web.log -a -p /home/yejianfeng/.goaccessrc -o json >test.json

和csv

goaccess -q -f web.log -a -p /home/yejianfeng/.goaccessrc -o csv>test.csv

等等,還缺點什麼?

正如文章,人無完人,工具無完美工具,goaccess也有幾個讓人不夠爽的地方

geoip粒度太粗

它是使用機器自帶的GeoIP,這個自帶的77k左右的IP庫只能判斷出國籍,不能判斷到城市。呃,這個就意味著你的報表中有99%的IP統計是來自:China。你可以升級你的GeoIp,但是,付費。網上有免費的GeoLiteCity.dat庫,但是goaccess自身就不支援國籍-城市的分類,也不支援使用外部的IP庫。

我能想到還有的辦法就是用goaccess生成json,然後自己寫python也好,php也好程式來載入城市的Ip庫來解析地理位置。然後再生成報表。不過,這樣,好像就不美了。

好訊息是這個功能在ISSUE中有人提了,TODO LIST。

日期粒度太粗

日期只能粒度到天,如果需要統計一天每個小時的訪問資料,就沒法了。也不是沒辦法,你可以先grep小時的資料,然後再用goaccess解析。不過,這樣,好像很挫。

好訊息是這個功能在ISSUE中有人提了,TODO LIST。

所以說....TODO LIST真是個好東西,是吧。另外,本文的goaccess使用v0.7.1。

附:我的goaccess: