一款開源且具有交互視圖界面的實時 Web 日誌分析工具

前言

在 Linux 操作系統下,分析日誌文件是一件非常頭疼的事情,它記錄了很多日誌,對於大多數的新手及系統管理員不知該如何下手進行分析,除非你在分析日誌方面有足夠的經驗積累,那就是 Linux 系統高手了。

而在 Linux 操作系統中也有許多分析日誌工具,GoAccess 是允許用戶輕鬆分析 Web 服務器日誌的工具之一,在這篇文章中我們將詳細介紹 GoAcccess 工具。

什麼是 GoAccess?

GoAccess 是一個開源的實時 Web 日誌分析器交互式查看器,可以在 *nix 系統中的終端運行或通過瀏覽器進行訪問,它需要的依賴少,採用 C 語言編寫,只需 ncurses,支持 Apache、Nginx 和 Lighttpd 日誌,爲需要動態可視化服務器報告的系統管理員提供了高效的具有價值的 HTTP 統計信息

爲什麼要用 GoAccess?

GoAccess 可解析指定的 Web 日誌文件並將數據輸出至終端和瀏覽器,基於終端的快速日誌分析器,其主要還是實時快速分析並查看 Web 服務器上的統計信息,無需使用瀏覽器,默認是在終端輸出,能夠將完整的實時 HTML 報告以及 JSON 和 CSV 報告。

GoAccess 支持任何自定義日誌格式,Apache/Nginx中的組合日誌格式:XLF/ELF,Apache 中的通用日誌格式:CLF,但並不限於此。

GoAccess 的功能

  • 完全實時: 所有面板和指標時間安排在終端輸出以每 200 ms 更新一次,在 HTML輸出上每秒更新一次的頻率;
  • 支持幾乎所有 Web 日誌格式: GoAccess 允許任何自定義日誌格式字符串。預定義的選項包括Apache,Nginx,Amazon S3,Elastic Load Balancing,CloudFront等
  • 支持跟蹤應用程序響應時間: 跟蹤處理請求所需的時間,當網站運行緩慢時,其效果非常實用;
  • 支持增量日誌處理: 可通過磁盤 B + Tree 數據庫增量處理日誌;
  • 所需配置最少: 可以僅對訪問日誌文件運行它,選擇日誌格式後讓 GoAccess 解析訪問日誌並向您進行顯示統計信息;
  • 訪問者: 按小時或日期確定運行最慢請求的點擊數、訪問者、帶寬和指標等;
  • 每個虛擬主機的指標: 具有一個面板,顯示哪個虛擬主機正在消耗大多數 Web 服務器資源;
  • 可自定義配色: 可根據自己的顏色進行調整,通過終端或簡單的在 HTML 輸出上應用樣式表;
  • 僅一個依賴: 用 C 語言編寫,運行它,只需將 ncurses 作爲依賴項即可;
  • 對大型數據集的支持: 爲大型數據集提供了一個磁盤 B + Tree 存儲,無法容納所有內存;
  • Docker支持: 能夠從上游構建GoAccess的Docker映像。

GoAccess 默認所支持的 Web 日誌格式

  • Amazon CloudFront:亞馬遜 CloudFront Web 分佈式系統
  • AWSS3:亞馬遜簡單存儲服務 (S3)
  • AWSELB:AWS 彈性負載平衡
  • COMBINED:組合日誌格式(XLF/ELF) Apache | Nginx
  • COMMON:通用日誌格式(CLF) Apache
  • Google Cloud Storage:谷歌雲存儲
  • Apache virtual hosts:Apache 虛擬主機
  • Squid Native Format:Squid 原生格式
  • W3C:W3C (IIS)格式

GoAccess 日期格式

  • time-format: 參數time-format變量後需要跟一個空格,指定日誌格式日期。該日期包含常規字符特殊格式說明符的任意組合。以百分比(%)符號開頭。可參考:man strftime%T%H:%M:%S

注意:以毫秒爲單位的時間戳,則%f必須將其用作時間格式。

  • date-format: 參數date-format變量後需要跟一個空格,指定日誌格式日期。該日期包含常規字符特殊格式說明符的任意組合。以百分比(%)符號開頭。可參考:man strftime

注意:時間戳以微秒爲單位,則%f必須用作日期格式。

  • 日誌格式: 日誌格式變量後需要跟一個空格\t製表符分隔符,指定日誌格式字符串。

特殊字符所代表的含義

  • %x: 與時間格式和日期格式變量匹配的日期和時間字段。當時間戳而不是將日期和時間放在兩個單獨的變量中時,使用此方法;
  • %t: 與時間格式變量匹配的時間字段;
  • %d: 匹配日期格式變量的日期字段;
  • %v: 根據規範名稱設置的服務器名稱(服務器塊或虛擬主機);
  • %e: 請求文檔時由 HTTP 驗證決定的用戶 ID;
  • %h: 主機(客戶端IP地址,IPv4 或 IPv6)
  • %r: 客戶端的請求行。這就請求的特定定界符(單引號,雙引號等)是可解析的。否則需使用特殊的格式說明符,例如:%m%U%q%H解析各個字段,可使用%r獲取完整的請求,也可使用%m%U%q%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)。

GoAccess 三個存儲選項

  • 默認哈希表:內存存儲提供了更好的性能,其缺點是將數據集的大小限制在可用物理內存的數量。默認情況下,GoAccess 將使用內存中的哈希表。數據集如果放在內存中,執行會很好。因爲它具有很好的內存使用和相當好的性能;

  • Tokyo Cabinet 磁盤B+樹:使用此存儲方法主要針對無法在內存中容納所有內容的大型數據集。B+樹數據庫比任何哈希數據庫都慢,因爲它的數據必須提交到磁盤。從而使用 SSD 可以極大地提高性能。如果需要數據持久性以及接下來要快速加載的統計數據,可使用該存儲方法;

  • Tokyo Cabinet 內存哈希表:它是默認哈希表的替代方案,使用泛型類型,針對內存和速度而言,它的性能是平均的;

安裝 GoAccess

源碼安裝

# wget https://tar.goaccess.io/goaccess-1.3.tar.gz
# tar -xzvf goaccess-1.3.tar.gz
# cd goaccess-1.3/
# ./configure --enable-utf8 --enable-geoip=legacy
# make
# make install

Debian / Ubuntu 系統

# apt-get install goaccess

獲取最新 GoAccess 包,請使用 GoAccess 官方存儲庫,如下:

$ echo "deb https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/goaccess.list
$ wget -O - https://deb.goaccess.io/gnugpg.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install goaccess

注意:

  • 要獲得磁盤上的支持(Trusty +Wheezy +)可執行:
$ sudo apt-get install goaccess-tcb
  • .deb官方庫的軟件包可以通過HTTPS獲取,這裏可能需要安裝,可執行:
$ apt-transport-https

RHEL / CentOS 系統

# yum install goaccess

OS X / Homebrew

# brew install goaccess

使用 GoAccess

不同方式的輸出格式:

輸出至終端並生成交互式報告:

# goaccess access.log

生成 HTML 報告:

# goaccess access.log -a -o report.html

生成 JSON 報告:

# goaccess access.log -a -d -o report.json

生成 CSV 文件:

# goaccess access.log --no-csv-summary -o report.csv

GoAccess 爲實時過濾和解析提供了巨大的靈活性。如果要從 goaccess 啓動以來通過監視日誌來快速診斷問題:

# tail -f access.log | goaccess-

如果你要進行篩選,同時保持打開的管道保持實時分析,我們可以利用的tail -f和匹配模式的工具,如grepawksed等來進行實現

# tail -f access.log | grep -i --line-buffered 'firefox' | goaccess --log-format=COMBINED -

從文件的開頭進行解析,保持管道處於打開狀態並應用過濾器

# tail -f -n +0 access.log | grep -i --line-buffered 'firefox' | goaccess -o report.html --real-time-html -

多日誌文件輸出格式:

將多個日誌文件傳遞到命令行:

# goaccess access.log access.log.1

讀取常規文件時從管道中解析文件:

# cat access.log.2 | goaccess access.log access.log.1-

注意:單破折號附加到命令行以使GoAccess知道它應該從管道讀取,在Mac OS X上,請使用 gunzip -c 代替 zcat。

實時 HTML 輸出格式:

生成實時 HTML 報告的過程與創建靜態報告的過程類似,只需加個參數選項:--real-time-html使其實現實時的效果。

# goaccess access.log -o /usr/share/nginx/html/site/report.html --real-time-html

除上述三種操作使用外,還可以與日期、虛擬主機、文件,狀態代碼和啓動、服務器一起相結合使用,更多細節請參考其man手冊頁幫助

# man goaccess
或
# goaccess --help

Matters needing attention

每個活動面板共有366個項目,或實時HTML報告中的50個項目,可使用max-items自定義項目數量。但是,只有CSVJSON輸出允許的最大數量大於每個面板366個項目的默認值。

使用磁盤B + Tree兩次分析同一日誌文件--keep-db-files--load-from-disk在每次運行時使用和時,GoAccess 將每個條目計數兩次。

匹配是請求訪問日誌中的內容,10個請求 = 10個匹配。具有相同IP日期用戶代理HTTP請求被視爲唯一訪問。

Problems during installation

安裝過程中,難免會出現一些問題,具體可參考如下鏈接:

1、https://www.cnblogs.com/zkfopen/p/10126959.html
2、https://www.cnblogs.com/jshp/p/10143170.html

Reference

1、https://github.com/allinurl/goaccess
2、https://goaccess.io/features
3、https://goaccess.io/get-started
4、https://goaccess.io/man
5、https://goaccess.io/download

總結

通過本篇文章介紹了什麼是 GoAccess、爲什麼要用 GoAccess、GoAccess 的功能、GoAccess 默認所支持的 Web 日誌格式、GoAccess 日期格式、GoAccess 特殊字符所代表的含義、GoAccess 三個存儲選項、安裝以及結合不同場景使用GoAccess,希望大家在今後的工作中能運用起來並通過該工具來解決日常 Web 服務器一些日誌的相關問題。

原創不易,莫要白票,覺得有點用的話,麻煩你爲本文點個贊,或者無情地轉發吧,因爲這將是我輸出更多優質文章的動力,感謝!

最後,歡迎大家關注我的微信公衆號:傑哥的IT之旅,關注後回覆1024有驚喜。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章