利用GoAccess實時分析web服務日志


1、GoAccess是什么

GoAccess 是一款開源的且具有交互視圖界面的實時 Web 日志分析工具,通過你的 Web 瀏覽器或者 *nix 系統下的終端程序(terminal)即可訪問。
能為系統管理員提供快速且有價值的 HTTP 統計,並以在線可視化服務器的方式呈現。

2、為什么要用GoAccess

GoAccess 被設計成快速的並基於終端的日志分析工具。其核心理念是不需要通過 Web 瀏覽器就能快速分析並實時查看 Web 服務器的統計數據(這對於需要使用 SSH 來對訪問日志進行快速分析或者就是喜歡在終端環境下工作的人來說是超贊的)。
終端輸出僅僅是默認的輸出方式,GoAccess 還支持生成完整的實時 HTML 報告(這對分析、監控以及數據可視化都是極好的),以及 JSON 和 CSV 格式的報告。

3、GoAccess功能

GoAccess 解析指定的 Web 日志文件並將統計結果輸出到 X 終端。功能如下:

  • 通用統計: 此面板展示了幾個主要指標,比如:有效和無效請求的數量,分析這些數據所花費的時間,獨立訪客的情況,請求的文件,靜態文件(CSS, ICO, JPG 等)的完整URL,404錯誤,被解析的日志文件的大小以及消耗的帶寬。
  • 獨立訪客: 此面板按照日期展示了訪問次數,獨立訪客數,以及累計消耗的帶寬等指標。具有相同IP,相同訪問時間,相同的 UserAgent 的 HTTP 請求將會被識別為獨立訪客。默認情況下包含了網絡爬蟲。也可以選擇使用 --date-spec=hr 參數將按照日期分析修改為按照小時,例如:05/Jun/2016:16 。這對於希望在小時級別去跟蹤每日流量非常有幫助。
  • 請求的文件: 此面板展示服務器上被請求次數最多的文件。包含訪問次數,獨立訪客數,百分比,累計消耗帶寬,使用的協議,請求方式。
  • 請求的靜態文件: 列出請求頻率最高的靜態文件類型,例如:JPG, CSS, SWF, JS, GIF, 和 PNG, 以及和上一個面板一樣的其他指標。 另外靜態文件可以被添加到配置文件中。
  • 404或者文件未找到: 展示內容與之前的面板類似,但是其數據包含了所有未找到的頁面,以及俗稱的 404 狀態碼。
  • 主機: 此面板展示主機自身的詳細信息。能夠很好的發現不懷好意的爬蟲以及識別出是誰吃掉了你的帶寬。擴展面板將展示更多信息,比如主機的反向DNS解析結果,主機所在國家和城市。如果開啟了 參數,選擇想查看的 IP 地址並按回車,將會顯示 UserAgent 列表。
  • 操作系統: 此面板將顯示主機使用的操作系統的信息。GoAccess 將盡可能嘗試為每一款操作系統提供詳細的信息。
  • 瀏覽器: 此面板將顯示來訪主機使用的瀏覽器信息。GoAccess 將盡可能嘗試為每一款瀏覽器提供詳細的信息。
  • 訪問次數: 此面板按小時報告。因此將顯示24個數據點,每一個均對應每一天的某一個小時。使用 --hour-spec=min 參數可以設定為按每十分鍾報告,並將以 16:4 的格式顯示時間。這對發現服務器的峰值訪問時段很有幫助。
  • 虛擬主機: 此面板將顯示從訪問日志中解析出來的不同的虛擬主機的情況。此面板僅在日志格式中啟用了 %v 參數時顯示。
  • 來路URL: 如果問題主機通過其他的資源訪問了你的站點,以及通過從其他主機上的鏈接或者跳轉到你的站點,則這些來路URL將會被顯示在此面板。可以在配置文件中通過 --ignore-panel 開啟此功能。(默認關閉)
  • 來路站點: 此面板將僅顯示主機的部分,而不是完整的URL。
  • 關鍵字: 報告支持用在谷歌搜索,谷歌緩存,谷歌翻譯上使用關鍵字。目前僅支持通過 HTTP 使用谷歌搜索。 可以在配置文件中通過 --ignore-panel 開啟此功能。(默認關閉)
  • 地理位置: 根據 IP 地址判斷地理位置。統計數據按照大洲和國家分組。需要地理位置模塊的支持。
  • HTTP 狀態碼: 以數字表示的 HTTP 請求的狀態編碼。
  • 遠程用戶(HTTP驗證): 通過 HTTP 驗證來確定訪問文檔的權限。如果文檔沒有被密碼保護起來,這部分將會顯示為 “-”。此面板默認為開啟,除非在日志格式變量中設置了參數%e。

4、GoAccess特點

  • 完全實時: 所有面板以及指標均按照指定時間間隔更新,在終端(Terminal)下是200ms,HTML則是每秒。
  • 支持幾乎所有 Web 日志格式: GoAccess 允許任意自定義日志格式。 可預定義的格式包括: Apache, Nginx, Amazon S3, Elastic Load Balancing, CloudFront, 等等
  • 跟蹤應用響應時間: 跟蹤處理請求的時間消耗。對於解決站點頁面訪問速度下降非常有用。
  • 增長日志處理: 需要持續保持數據?GoAccess 有能力處理在磁盤上以 B+Tree 數據庫存儲並且不斷增長的日志。
  • 僅依賴一個模塊: GoAccess 是用 C 語言編寫的。 僅僅需要 ncurses 這一個模塊即可運行。同時 GoAccess 甚至還擁有自己的兼容 RFC6455 協議的 Web Socket 服務器。
  • 易於使用: 可以直接運行 GoAccess 去處理您的訪問日志文件,僅需選取日志格式然后讓 GoAccess 解析日志內容並將統計結果展示出來。
  • 訪客畫像: 可以按照小時或者指定日期確定最慢請求的訪問次數,訪客數量,帶寬以及其他相關度量值。
  • 支持虛擬主機: 擁有多個虛擬主機?在控制面板中能夠顯示出哪一個虛擬主機消耗 Web 服務器上最多的資源。
  • 配色風格可定制化: GoAccess 的配色風格十分易於定制化。無論是通過終端,還是僅僅通過簡單修改 HTML 頁面的層疊樣式表。

5、安裝GoAccess

安裝有兩種方式:源碼編譯安裝和yum安裝
本機環境

# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

5.1、源碼安裝

下載包並編譯

# wget -c https://tar.goaccess.io/goaccess-1.3.tar.gz
# tar -xzvf goaccess-1.3.tar.gz
# cd goaccess-1.3/
# ./configure --prefix=/usr/local/goaccess --enable-utf8 --enable-geoip=legacy --with-openssl

根據錯誤提示依次解決依賴關系
報錯一:

configure: error: 
    *** Missing development files for the GeoIP library
# yum install -y GeoIP-devel

報錯二:

configure: error: *** Missing development libraries for ncursesw
# yum install -y ncurses-devel

再次編譯安裝

# ./configure --prefix=/usr/local/goaccess --enable-utf8 --enable-geoip=legacy --with-openssl
...
Your build configuration:

  Prefix         : /usr/local/goaccess
  Package        : goaccess
  Version        : 1.3
  Compiler flags :  -pthread
  Linker flags   : -lnsl -lncursesw -lGeoIP -lcrypto -lssl -lpthread  
  Dynamic buffer : no
  Geolocation    : GeoIP Legacy
  Storage method : In-memory Hash Database (Default)
  TLS/SSL        : yes
  Bugs           : goaccess@prosoftcorp.com
# make && make install
...
make[3]: Entering directory `/root/goaccess-1.3'
 /usr/bin/mkdir -p '/usr/local/goaccess/bin'
  /usr/bin/install -c goaccess '/usr/local/goaccess/bin'
 /usr/bin/mkdir -p '/usr/local/goaccess/etc/goaccess'
 /usr/bin/install -c -m 644 config/goaccess.conf config/browsers.list '/usr/local/goaccess/etc/goaccess'
 /usr/bin/mkdir -p '/usr/local/goaccess/share/man/man1'
 /usr/bin/install -c -m 644 goaccess.1 '/usr/local/goaccess/share/man/man1'
make[3]: Leaving directory `/root/goaccess-1.3'
make[2]: Leaving directory `/root/goaccess-1.3'
make[1]: Leaving directory `/root/goaccess-1.3'

5.1、yum安裝

通過yum安裝可以自動的解決依賴問題

# yum install goaccess -y

6、配置

  • 配置環境變量
# echo "export PATH=/usr/local/goaccess/bin:$PATH" >>/etc/profile
# source /etc/profile
# goaccess -V
GoAccess - 1.3.
For more details visit: http://goaccess.io
Copyright (C) 2009-2016 by Gerardo Orellana

Build configure arguments:
  --enable-utf8
  --enable-geoip=legacy
  --with-openssl
  • 自定義日志/日期格式

GoAccess可以解析虛擬的任意Web日志格式。
預定義的選項包括:通用日志格式,聯合日志格式,包含虛擬主機,W3C格式以及亞馬遜CloudFront(分布式下載)。
GoAccess允許任意的自定義格式字符串。

有兩種方法配置日志格式。最簡單的方式是運行 GoAccess時使用-c顯示一個配置窗口。但是這種方式不是永久有效的,因此你需要在配置文件中設定格式。

配置文件位於:%sysconfdir%/goaccess.conf 或者~/.goaccessrc
注意:%sysconfdir%可能是/etc/, /usr/etc/或者/usr/local/etc/

time-format參數time-format后跟隨一個空格符,指定日志的時間格式,包含普通字符與特殊格式說明符的任意組合。他們都由百分號(%)開始。參考 man strftime%T或者%H:%M:%S.
注意: 如果給定的時間戳以微秒計算,則必須在 time-format中使用參數%f

date-format 參數 date-format 后跟隨一個空格符,指定日志的日期格式,包含普通字符與特殊格式說明符的任意組合。他們都由百分號 (%)開始。參考 man strftime
注意: 如果給定的時間戳以微秒計算,則必須在 time-format中使用參數%f

log-format參數log-format后跟隨一個空格符或者制表分隔符(\t),用於指定日志字符串格式。

  • 特殊格式說明符

  • %x 匹配 time-format 和 date-format 變量的日期和時間字段。用於使用時間戳來代替日期和時間兩個獨立變量的場景。

  • %t 匹配 time-format 變量的時間字段。

  • %d 匹配 date-format 變量的日期字段。

  • %v 根據 canonical 名稱設定的服務器名稱(服務區或者虛擬主機)。

  • %e 請求文檔時由 HTTP 驗證決定的用戶 ID。

  • %h 主機(客戶端IP地址,IPv4 或者 IPv6)。

  • %r 客戶端請求的行數。這些請求使用分隔符(單引號,雙引號)引用的部分可以被解析。否則,需要使用由特殊格式說明符(例如:%m, %U, %q 和 %H)組合格式去解析獨立的字段。

  • 注意: 既可以使用 %r 獲取完整的請求,也可以使用 %m, %U, %q and %H 去組合你的請求,但是不能同時使用。

  • %m 請求的方法。

  • %U 請求的 URL。

  • 注意: 如果查詢字符串在 %U中,則無需使用 %q。但是,如果 URL 路徑中沒有包含任何查詢字符串,則你可以使用 %q 查詢字符串將附加在請求后面。

  • %q 查詢字符串。

  • %H 請求協議。

  • %s 服務器回傳客戶端的狀態碼。

  • %b 回傳客戶端的對象的大小。

  • %R HTTP 請求的 "Referer" 值。

  • %u HTTP 請求的 "UserAgent" 值。

  • %D 處理請求的時間消耗,使用微秒計算。

  • %T 處理請求的時間消耗,使用帶秒和毫秒計算。

  • %L 處理請求的時間消耗,使用十進制數表示的毫秒計算。

  • %^ 忽略此字段。

  • %~ 繼續解析日志字符串直到找到一個非空字符(!isspace)。

  • ~h 在 X-Forwarded-For (XFF) 字段中的主機(客戶端 IP 地址,IPv4 或者 IPv6)。

  • 修改配置文件

# vim /usr/local/goaccess/etc/goaccess/goaccess.conf
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

本文示例用來分析nginx的日志,為了分析的精准度,配置一下nginxlog_format為通用格式

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_cookie" "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

7、使用

常用參數說明

  • -a --agent-list 啟用由主機用戶代理的列表。為了更快的解析,不啟用該項
  • -d --with-output-resolver 在HTML/JSON輸出中開啟IP解析,會使用GeoIP來進行IP解析
  • -f --log-file 需要分析的日志文件路徑
  • -p --config-file 配置文件路徑
  • -o --output 輸出格式,支持html、json、csv
  • -m --with-mouse 控制面板支持鼠標點擊
  • -q --no-query-string 忽略請求的參數部分
  • --real-time-html 實時生成HTML報告
  • --daemonize 守護進程模式,--real-time-html時使用

7.1、控制台模式

# pwd
/var/log/nginx
# goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf

控制台操作方法按鍵

  • F1 主幫助頁面
  • F5 重繪主窗口
  • q 退出
  • 1-15 跳轉到對應編號的模塊位置
  • o 打開當前模塊的詳細視圖
  • j 當前模塊向下滾動
  • k 當前模塊向上滾動
  • s 對模塊排序
  • / 在所有模塊中搜索匹配
  • n 查找下一個出現的位置
  • g 移動到第一個模塊頂部
  • G 移動到最后一個模塊底部

效果如下

7.2、HTML模式

# pwd
/var/log/nginx
# goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf -o /usr/local/nginx/html/www.ssgeek.com/go-access.html
Parsing... [9,692] [692/s]s]

此處生成的html直接定向到了站點目錄下,因此分析並生成html文件后即可進行訪問,不多說此處上大圖!

7.3、守護進程模式

使用daemonize模式運行,生成實時HTML報告的過程與創建靜態報告的過程非常相似,只需要在啟動命令后添加--real-time-html--daemonize參數即可

# goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf -o /usr/local/nginx/html/www.ssgeek.com/go-access.html --real-time-html --daemonize
Daemonized GoAccess: 13308

默認監聽的是7890端口,可以使用--port指定端口號啟動后會提示WebSocket服務器已准備接收來自客戶的連接

# netstat -lntup|grep 7890
tcp        0      0 0.0.0.0:7890            0.0.0.0:*               LISTEN      13333/goaccess

如果網站開啟了HTTPS功能,就需要GoAccess啟用openssl,在配置文件goaccess.conf中配置ssl-certssl-key來支持openssl,還需要將ws-url指定為https的域名

7.4、定時更新

也可以通過定時任務的方式實現定時更新HTML報表,每30分鍾刷新一次

# crontab -e
*/30 * * * * goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf -o /usr/local/nginx/html/www.ssgeek.com/go-access.html

7.5、處理不斷增長的日志

處理不斷增長的日志指的是當日志按照某些規則進行切割,例如nginx日志每天切割一份的情況。這個時候GoAccess通過磁盤B+樹數據庫能夠處理不斷增長的日志。工作原理如下:

  • 首先數據集必須使用 --keep-db-files, 參數保存,然后相同的數據集可以使用參數 --load-from-disk 載入。
  • 收到新的數據(來自管道或者文件)后,將會被附加到原始數據集上。
  • 在任何時候都保存數據, 則必須使用 --keep-db-files 參數。
  • 如果在使用參數 --load-from-disk 時沒有同時使用 --keep-db-files 參數,則數據庫文件在程序關閉時將會被刪除。

示例:

// 上個月的訪問日志
goaccess access.log.1 --keep-db-files

然后,載入

// 添加這個月的新日志,並保存為新數據
goaccess access.log --load-from-disk --keep-db-files

讀取已經保存的數據(不解析新數據)

goaccess --load-from-disk --keep-db-files

7.6、其他使用

  • 生成 JSON 報告
# goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf -o json > report.json
  • 生成 CSV 文件
# goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf -o csv > report.csv
  • 實施過濾和解析
# tail -f nginx_access.log | goaccess -p /usr/local/goaccess/etc/goaccess/goaccess.conf -
  • 分析多個文件
# goaccess -p /usr/local/goaccess/etc/goaccess/goaccess.conf access.log.1 access.log.2

參考:
https://goaccess.cc/
https://github.com/allinurl/goaccess


免責聲明!

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



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