GoAccess 是一個開源即時 Web 日誌分析器和互動式檢視器,可在 *nix 系統上的終端機中或透過瀏覽器運作。它為需要動態視覺化伺服器報告的系統管理員提供快速且有價值的 HTTP 統計資料。更多資訊請見:https://goaccess.io。
GoAccess解析指定的網路日誌檔案並將資料輸出到X終端。特點包括:
完全即時
所有面板和指標都定時在終端輸出上每 200 毫秒更新一次,在 HTML 輸出上每秒更新一次。
所需的最低配置
您只需針對存取日誌檔案執行它,選擇日誌格式,然後讓 GoAccess 解析存取日誌並向您顯示統計資料。
追蹤應用程式回應時間
追蹤處理請求所花費的時間。如果您想追蹤減慢網站速度的頁面,則非常有用。
幾乎所有網頁日誌格式
GoAccess 允許任何自訂日誌格式字串。預定義選項包括 Apache、Nginx、Amazon S3、Elastic Load Balancing、CloudFront 等。
增量日誌處理
需要資料持久化? GoAccess 能夠透過磁碟持久性選項增量處理日誌。
只有一個依賴
GoAccess 是用 C 語言編寫的。就是這樣。它甚至擁有自己的 Web Socket 伺服器 — http://gwsocket.io/。
訪客
按小時或日期決定點擊量、訪客、頻寬和最慢運行請求的指標。
每個虛擬主機的指標
擁有多台虛擬主機(伺服器區塊)?它有一個面板,顯示哪個虛擬主機消耗了大部分 Web 伺服器資源。
ASN(自治系統編號映射)
非常適合檢測惡意流量模式並相應地阻止它們。
配色方案可客製化
客製化 GoAccess 以適合您自己的顏色品味/方案。透過終端,或簡單地在 HTML 輸出上套用樣式表。
支援大型數據集
由於其最佳化的記憶體雜湊表,GoAccess 具有解析大型日誌的能力。它具有非常好的記憶體使用率和相當好的性能。該存儲還支援磁碟持久性。
Docker 支援
能夠從上游建立 GoAccess 的 Docker 映像。您仍然可以透過使用磁碟區映射和編輯goaccess.conf
來完全配置它。請參閱下面的 Docker 部分。
GoAccess 允許任何自訂日誌格式字串。預定義選項包括但不限於:
GoAccess 被設計為一個快速的、基於終端的日誌分析器。其核心思想是快速即時分析和查看 Web 伺服器統計數據,而無需使用瀏覽器(如果您想透過 SSH 快速分析存取日誌,或者如果您只是喜歡在終端中工作,那麼這非常有用)。
雖然終端輸出是預設輸出,但它能夠產生完整、獨立的即時HTML
報告以及JSON
和CSV
報告。
您可以將其視為一個監視命令工具而不是其他任何工具。
GoAccess可以在*nix系統上編譯和使用。
下載、解壓縮並編譯 GoAccess:
$ wget https://tar.goaccess.io/goaccess-1.9.3.tar.gz
$ tar -xzvf goaccess-1.9.3.tar.gz
$ cd goaccess-1.9.3/
$ ./configure --enable-utf8 --enable-geoip=mmdb
$ make
# make install
$ git clone https://github.com/allinurl/goaccess.git
$ cd goaccess
$ autoreconf -fiv
$ ./configure --enable-utf8 --enable-geoip=mmdb
$ make
# make install
使用 GNU+Linux 發行版的首選套件管理器在 GNU+Linux 上安裝 GoAccess 是最簡單的。請注意,並非所有發行版都會提供最新版本的 GoAccess。
# apt-get install goaccess
注意:這可能會安裝過時版本的 GoAccess。為了確保您正在執行的是最新穩定版本的 GoAccess,請參閱下面的替代選項。
$ wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
$ echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
$ sudo apt-get update
$ sudo apt-get install goaccess
筆記:
.deb
套件也可以透過 HTTPS 取得。您可能需要安裝apt-transport-https
。 # yum install goaccess
# pacman -S goaccess
# emerge net-analyzer/goaccess
# brew install goaccess
# cd /usr/ports/sysutils/goaccess/ && make install clean
# pkg install sysutils/goaccess
# cd /usr/ports/www/goaccess && make install clean
# pkg_add goaccess
# zypper ar -f obs://server:http http
# zypper in goaccess
# pkg install goaccess
# pkgin install goaccess
GoAccess 可以透過 Cygwin 在 Windows 中使用。請參閱 Cygwin 的軟體包。或透過 Windows 10 上的 GNU+Linux 子系統。
GoAccess 的要求極低,它是用 C 語言編寫的,只需要 ncurses。不過,下表列出了一些發行版中用於從原始碼建立 GoAccess 的一些可選依賴項。
發行版 | NCurses | GeoIP(可選) | GeoIP2(可選) | OpenSSL(選用) |
---|---|---|---|---|
Ubuntu/Debian | libncurses-dev | libgeoip-dev | libmaxminddb-dev | libssl 開發 |
RHEL/CentOS | ncurses-開發 | 地理開發 | libmaxminddb-開發 | openssl 開發 |
拱 | 恩詛咒 | 地理資訊 | libmaxminddb | 開放式SSL |
根圖 | 系統庫/ncurses | 開發庫/geoip | 開發庫/libmaxminddb | 開發庫/openssl |
斯萊克軟體 | 恩詛咒 | 地理IP | libmaxminddb | 開放式SSL |
注意:您可能需要安裝gcc
、 autoconf
、 gettext
、 autopoint
等建置工具來從原始碼編譯/建置軟體。例如, base-devel
、 build-essential
、 "Development Tools"
。
Docker 映像已更新,能夠引導存取日誌的輸出。如果您只想輸出報告,可以將日誌從外部環境透過管道傳輸到基於 Docker 的進程:
touch report.html
cat access.log | docker run --rm -i -v ./report.html:/report.html -e LANG=$LANG allinurl/goaccess -a -o report.html --log-format COMBINED -
或即時
tail -F access.log | docker run -p 7890:7890 --rm -i -e LANG=$LANG allinurl/goaccess -a -o report.html --log-format COMBINED --real-time-html -
您也可以在隔離的容器環境中為基於 Debian 的系統建立二進位文件,以防止開發庫弄亂您的本機系統:
$ curl -L "https://github.com/allinurl/goaccess/archive/refs/heads/master.tar.gz" | tar -xz && cd goaccess-master
$ docker build -t goaccess/build.debian-12 -f Dockerfile.debian-12 .
$ docker run -i --rm -v $PWD:/goaccess goaccess/build.debian-12 > goaccess
您可以在 DOCKER.md 中閱讀有關使用 docker 映像的更多資訊。
記憶體儲存提供了更好的效能,但代價是將資料集大小限制為可用實體記憶體量。 GoAccess 使用記憶體中的哈希表。它具有非常好的記憶體使用率和相當好的性能。該存儲還支援磁碟持久性。
查看可以提供給命令或在設定檔中指定的選項。如果在設定檔中指定,則需要使用長選項,而不需要在前面新增--
。
注意:將資料透過管道傳輸到 GoAccess 不會提示日誌/日期/時間配置對話框,您需要事先在設定檔或命令列中定義它。
要輸出到終端並產生互動式報告:
# goaccess access.log
要產生 HTML 報告:
# goaccess access.log -a > report.html
要產生 JSON 報告文件:
# goaccess access.log -a -d -o report.json
要產生 CSV 報告到標準輸出:
# goaccess access.log --no-csv-summary -o 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 解析多個日誌的方法有多種。最簡單的是將多個日誌檔案傳遞到命令列:
# goaccess access.log access.log.1
甚至可以在讀取常規文件時從管道解析文件:
# cat access.log.2 | goaccess access.log access.log.1 -
注意:單一破折號附加到命令列,讓 GoAccess 知道它應該從管道讀取。
現在,如果我們想為 GoAccess 添加更多靈活性,我們可以使用zcat --force
來讀取壓縮和未壓縮檔案。例如,如果我們想處理所有日誌檔案access.log*
,我們可以這樣做:
# zcat --force access.log* | goaccess -
注意:在 Mac OS X 上,使用gunzip -c
而不是zcat
。
使用--jobs=
(或-j
)啟用多執行緒解析。例如:
# goaccess access.log -o report.html -j 4
並使用--chunk-size=<256-32768>
調整區塊大小,預設區塊大小為 1024。
# goaccess access.log -o report.html -j 4 --chunk-size=8192
GoAccess有能力在HTML報告中輸出即時數據。您甚至可以透過電子郵件發送 HTML 文件,因為它由單一文件組成,沒有外部文件依賴項,這真是太簡潔了!
產生即時 HTML 報告的過程與建立靜態報告的過程非常相似。只需要--real-time-html
即可使其即時。
# goaccess access.log -o /usr/share/nginx/html/your_site/report.html --real-time-html
若要查看報告,您可以導覽至http://your_site/report.html
。
預設情況下,GoAccess 將使用產生的報表的主機名稱。或者,您可以指定用戶端瀏覽器將連線到的 URL。有關更詳細的範例,請參閱常見問題。
# goaccess access.log -o report.html --real-time-html --ws-url=goaccess.io
預設情況下,GoAccess 偵聽端口 7890,要使用 7890 以外的其他端口,您可以將其指定為(確保該端口已打開):
# goaccess access.log -o report.html --real-time-html --port=9870
若要將 WebSocket 伺服器綁定到 0.0.0.0 以外的其他位址,您可以將其指定為:
# goaccess access.log -o report.html --real-time-html --addr=127.0.0.1
注意:要透過 TLS/SSL 連線輸出即時數據,您需要使用--ssl-cert=
和--ssl-key=
。
另一個有用的管道是從網誌中過濾日期
以下將取得從05/Dec/2010
開始直到檔案末尾的所有 HTTP 請求。
# sed -n '/05/Dec/2010/,$ p' access.log | goaccess -a -
或使用相對日期,例如昨天或明天:
# sed -n '/'$(date '+%d/%b/%Y' -d '1 week ago')'/,$ p' access.log | goaccess -a -
如果我們只想解析從 DATE a 到 DATE b 的某個時間範圍,我們可以這樣做:
# sed -n '/5/Nov/2010/,/5/Dec/2010/ p' access.log | goaccess -a -
如果我們只想保留一定數量的數據並回收存儲,我們可以只保留一定的天數。例如保留並顯示最近 5 天:
# goaccess access.log --keep-last=5
假設您的日誌包含虛擬主機欄位。例如:
vhost.io:80 8.8.4.4 - - [02/Mar/2016:08:14:04 -0600] "GET /shop HTTP/1.1" 200 615 "-" "Googlebot-Image/1.0"
並且您希望將虛擬主機附加到請求中,以便查看頂級 url 屬於哪個虛擬主機:
awk '$8=$1$8' access.log | goaccess -a -
要做同樣的事情,還要使用即時過濾和解析:
tail -f access.log | unbuffer -p awk '$8=$1$8' | goaccess -a -
若要排除虛擬主機列表,您可以執行下列操作:
# grep -v "`cat exclude_vhost_list_file`" vhost_access.log | goaccess -
解析請求中的特定頁面,例如頁面視圖、 html
、 htm
、 php
等:
# awk '$7~/.html|.htm|.php/' access.log | goaccess -
請注意, $7
是通用和組合日誌格式的請求欄位(不含虛擬主機),如果您的日誌包含虛擬主機,那麼您可能需要使用$8
。最好檢查一下您要拍攝的領域,例如:
# tail -10 access.log | awk '{print $8}'
或解析特定的狀態代碼,例如 500(內部伺服器錯誤):
# awk '$9~/500/' access.log | goaccess -
或多個狀態代碼,例如全部 3xx 和 5xx:
# tail -f -n +0 access.log | awk '$9~/3[0-9]{2}|5[0-9]{2}/' | goaccess -o out.html -
要了解有多少機器人(爬蟲)正在存取您的伺服器,請執行以下操作:
# tail -F -n +0 access.log | grep -i --line-buffered 'bot' | goaccess -
另外,值得指出的是,如果我們想以較低的優先權運行 GoAccess,我們可以將其運行為:
# nice -n 19 goaccess -f access.log -a
如果您不想將其安裝在伺服器上,您仍然可以從本機電腦運行它!
# ssh -n root@server 'tail -f /var/log/apache2/access.log' | goaccess -
注意: SSH 需要-n
,以便 GoAccess 可以從 stdin 讀取。另外,請確保使用 SSH 金鑰進行身份驗證,因為如果需要密碼短語,它將無法運作。
我們收到了許多之前已經回答過的問題。
GoAccess 能夠透過其內部儲存增量處理日誌並將其資料轉儲到磁碟。它的工作原理如下:
--persist
持久保存資料集,然後才能載入相同的資料集。--restore
。如果傳遞新資料(透過管道或透過日誌檔案),它會將其附加到原始資料集。 GoAccess 追蹤所有已處理檔案的索引節點(假設檔案將保留在同一分區上),此外,它還會從日誌中提取資料片段以及每個檔案解析的最後一行和解析的最後一行的時間戳記。例如, inode:29627417|line:20012|ts:20171231235059
首先,它比較片段是否與正在解析的日誌匹配,如果匹配,則假設日誌沒有發生巨大變化,例如,沒有被截斷。如果 inode 與目前檔案不匹配,則會解析所有行。如果目前檔案與 inode 匹配,則會讀取剩餘行並更新已解析的行數和時間戳記。作為額外的預防措施,它不會解析時間戳≤儲存時間戳記的日誌行。
管道資料的工作原理是基於最後一行讀取的時間戳記。例如,它將解析並丟棄所有傳入條目,直到找到時間戳 >= 大於儲存的時間戳。
// last month access log
# goaccess access.log.1 --persist
然後,加載它
// append this month access log, and preserve new data
# goaccess access.log --restore --persist
僅讀取持久性資料(不解析新資料)
# goaccess --restore
歡迎任何有關 GoAccess 的協助。最有幫助的方法是嘗試並提供回饋。請隨意使用 GitHub 問題追蹤器和拉取請求來討論和提交程式碼變更。
您可以透過直接在 GitHub 上編輯 .po 檔案或使用 inlang.com 的視覺化介面來為我們的翻譯做出貢獻
享受!