前言
在 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
和匹配模式的工具,如grep
、awk
、sed
等來進行實現
# 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
自定義項目數量。但是,只有CSV
和JSON
輸出允許的最大數量大於每個面板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有驚喜。