GoAccess分析Web日志


簡介

為什么要用GoAccess?

GoAccess 被設計成快速的並基於終端的日志分析工具。其核心理念是不需要通過 Web 瀏覽器就能快速分析並實時查看 Web 服務器的統計數據(這對於需要使用 SSH 來對訪問日志進行快速分析或者就是喜歡在終端環境下工作的人來說是超贊的)。

終端輸出僅僅是默認的輸出方式,GoAccess 還支持生成完整的實時 HTML 報告(這對分析、監控以及數據可視化都是極好的),以及 JSON 和 CSV 格式的報告。

功能如下

  • 通用統計: 此面板展示了幾個主要指標,比如:有效和無效請求的數量,分析這些數據所花費的時間,獨立訪客的情況,請求的文件,靜態文件(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 。
    注意: 如果配置了可選項,所有面板將顯示處理請求的平均時間消耗。
存儲方式

GoAccess 支持三種類型的存儲方式。請根據你的需要和系統環境進行選擇。

  • 默認哈希表
    內存哈希表可以提供較好的性能,缺點是數據集的大小受限於物理內存的大小。GoAccess 默認使用內存哈希表。如果你的內存可以裝下你的數據集,那么這種模式的表現非常棒。此模式具有非常好的內存利用率和性能表現。
  • Tokyo Cabinet 磁盤 B+ 樹
    使用這種模式來處理巨大的數據集,大到不可能在內存中完成任務。當數據提交到磁盤以后,B+樹數據庫比任何一種哈希數據庫都要慢。但是,使用 SSD 可以極大的提高性能。往后您可能需要快速載入保存的數據,那么這種方式就可以被使用。
  • Tokyo Cabinet 內存哈希表
    作為默認哈希表的替換方案。因為使用通用類型在內存表現以及速度方面都很平均。

部署

初始化環境
init_security() {
systemctl stop firewalld
systemctl disable firewalld &>/dev/null
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
sed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_config
sed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config
systemctl enable sshd crond &> /dev/null
echo -e "\033[32m [安全配置] ==> OK \033[0m"
}

init_yumsource() {
if [ ! -d /etc/yum.repos.d/backup ];then
mkdir /etc/yum.repos.d/backup
fi
mv /etc/yum.repos.d/* /etc/yum.repos.d/backup 2>/dev/null
if ! ping -c2 www.baidu.com &>/dev/null
then
echo "您無法上外網,不能配置yum源"
exit
fi
curl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/null
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &>/dev/null
timedatectl set-timezone Asia/Shanghai
echo "nameserver 114.114.114.114" > /etc/resolv.conf
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
chattr +i /etc/resolv.conf
echo -e "\033[32m [YUM Source] ==> OK \033[0m"
}
部署GoAccess
#安裝依賴包
yum -y install glib2 glib2-devel ncurses ncurses-devel GeoIP GeoIP-devel GeoIP-data openssl-devel
wget https://tar.goaccess.io/goaccess-1.3.tar.gz

tar xf goaccess-1.3.tar.gz -C /usr/local/src/
cd goaccess-1.3
./configure --prefix=/usr/local/goaccess1.3 --enable-utf8 --enable-geoip=legacy --with-openssl


# --enable-debug  使用調試標志編譯且關閉編譯器優化。
# --enable-utf8   寬字符支持。依賴 Ncursesw 模塊。
# --enable-geoip=<legacy|mmdb>  地理位置支持。依賴 MaxMind GeoIP 模塊。 legacy 將使用原始 GeoIP 數據庫。 mmdb 將使用增強版 GeoIP2 數據庫。
# --enable-tcb=<memhash|btree>
# Tokyo Cabinet 存儲支持。 memhash 將使用 Tokyo Cabinet 的內存哈希數據庫。btree 將使用 Tokyo Cabinet 的磁盤 B+Tree 數據庫。
# --disable-zlib  禁止在 B+Tree 數據庫上使用 zlib 壓縮。
# --disable-bzip  禁止在 B+Tree 數據庫上使用 bzip2 壓縮。
# --with-getline  使用動態擴展行緩沖區用來解析完整的行請求,否則將使用固定大小(4096)的緩沖區。
# --with-openssl  使 GoAccess 與其 WebSocket 服務器之間的通信能夠支持 OpenSSL。

make && make install
ln -s /usr/local/goaccess1.3/ /usr/local/goaccess

echo "export PATH=/usr/local/goaccess/bin:$PATH" >>/etc/profile
source /etc/profile
配置GoAccess
vim /usr/local/goaccess/etc/goaccess/goaccess.conf
time-format %T
date-format %d/%b/%Y
log-format %h - %^ [%d:%t %^]; "%r" %s %b "%R" - %^"%u" - %^ %T

# 配置文件參數說明
# -time-format
# 參數 time-format 后跟隨一個空格符,指定日志的時間格式,包含普通字符與特殊格式說明符的任意組合。他們都由百分號 (%)開始。參考 man strftime。 %T 或者 %H:%M:%S.

# -date-format
# 參數 date-format 后跟隨一個空格符,指定日志的日期格式,包含普通字符與特殊格式說明符的任意組合。他們都由百分號 (%)開始。參考 man strftime。

# -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)。
部署Nginx
cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

yum -y instal nginx


# 配置Nginx日志格式
vim /etc/nginx/nginx.conf
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" $upstream_addr $request_time';

systemctl start nginx

使用

GoAccess常用參數
goaccess有控制台模式和html靜態頁面模式,這里先介紹一下控制台模式

goaccess -a -d -f logs/access_web.log -p /usr/local/goaccess/etc/goaccess/goaccess.conf

#常用參數
--addr=
# 將服務器綁定到指定 IP 地址。默認綁定到 0.0.0.0 。
通常無需指定,除非您希望將服務器綁定到主機上的其他地址。

--daemonize
# 使 GoAccess 作為守護程序運行(僅在 --real-time-html 開啟下有效)。

--origin=
# E在 WebSocket 握手中確保客戶端發送指定的源頭。且指定的源應與瀏覽器發送源頭字段完全相同。例如:--origin=http://goaccess.io

--port=
# 指定服務使用的端口。GoAccess 默認使用端口 7890 作為 WebSocket 服務器。請確保此端口可用。

--real-time-html
# 使能實時 HTML 報告。

--ws-url=<[scheme://]url[:port]>
# 此 URL 用於 WebSocket 服務器的回應。用於客戶端側的 WebSocket 構建器。
# 同時可以選擇指定 WebSocket 的 URI 協議,比如:ws:// 用於非加密連接, 以及 wss:// 用於加密連接。示例:wss://goaccess.io
# 如果 GoAccess 運行在代理服務器的后面,您需要通過在主機名后跟隨冒號加端口號的方式讓客戶端連接到另外一個不同的端口。示例:goaccess.io:9999
# 默認情況下,會嘗試去連接生成報告的主機名。如果 GoAccess 運行在一台遠程服務器上,則遠程主機名也應該在 URL 中指定。當然,必須保證主機是有效的。

--fifo-in=<path/file>
# 創建一個管道(先入先出)從指定的路徑/文件讀取數據。

--fifo-out=<path/file>
# 創建一個管道(先入先出)往指定的路徑/文件寫入數據。

--ssl-cert=<path/cert.crt>
# 指定 TLS/SSL 證書的路徑。使 GoAccess 支持 TLS/SSL,需要使用參數 --ssl-cert 和 --ssl-key。
# 僅在使用了參數 --with-openssl 時有效

--ssl-key=<path/priv.key>
# 指定 TLS/SSL 私鑰的路徑。使 GoAccess 支持 TLS/SSL,需要使用參數 --ssl-cert 和 --ssl-key。
# 僅在使用了參數 --with-openssl 時有效

1.24 FILE OPTIONS
-f --log-file=
# 指定輸入日志文件的路徑。如果在配置文件中指定了輸入文件,則其優先級要高於在命令行中通過 -f 參數指定。

-l --log-debug=
# 發送所有調試信息到指定文件。需要指定配置選項 --enable-debug

-p --config-file=
# 指定使用自定義配置文件。如果設置了此參數,其優先級將高於全局配置文件(如果有)。

--invalid-requests=
# 記錄無效請求到指定文件。

--no-global-config
# 禁止加載全局配置文件。可能的目錄應該是 /usr/etc/, /etc/ 或者 /usr/local/etc/, 除非在運行 ./configure 時指定了 --sysconfdir=/dir 。


-a --agent-list
# 開啟 UserAgent 列表。開啟后會降低解析速度。

-d --with-output-resolver
# 輸出 HTML 或者 JSON 報告時開啟 IP 解析。

-e --exclude-ip <IP|IP-range>
# 排除一個 IPv4 或者 IPv6 地址。 使用連接符表示 IP 段(開始-結束)。

exclude-ip 127.0.0.1
exclude-ip 192.168.0.1-192.168.0.100
exclude-ip ::1
exclude-ip 0:0:0:0:0:ffff:808:804-0:0:0:0:0:ffff:808:808
-H --http-protocol=<yes|no>
HTTP 請求協議開關。將創建一個請求字段包含請求協議+真實請求。

-M --http-method=<yes|no>
# HTTP 請求方法開關。將創建一個請求字段包含請求方法+真實請求。

-o --output=<json|csv>
# 將給定文件重定向到標准輸出,通過后綴名決定輸出格式:
/path/file.csv - Comma-separated values (CSV)
/path/file.json - JSON (JavaScript Object Notation)
/path/file.html - HTML
-q --no-query-string
# 忽略請求的查詢字符串。即: www.google.com/page.htm?query => www.google.com/page.htm
# 注意: 去掉查詢字符串將極大降低內存消耗,特別對帶時間戳的請求。

-r --no-term-resolver
# 在終端輸出時禁止 IP 解析。

--444-as-404
# 將非標准狀態 444 作為 404 處理。

--4xx-to-unique-count
# 將 4xx 客戶端錯誤數加到獨立訪客數中。

--all-static-files
# 統計包含查詢字符串的靜態文件。

--date-spec=<date|hr>
# 設置日期的顯示格式,一種是標准日期格式(默認),一種是日期后附加小時的格式。
# 僅在訪客面板有效。對於在小時級別分析訪客數據很有幫助。顯示格式示例:18/Dec/2010:19

--double-decode
# 解碼雙重編碼的值。包括 UserAgent,Request 以及 Referer。

--enable-panel=
# 開啟指定面板。面板列表

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

配置nginx域名訪問goaccess
# 導入訪問日志
goaccess -f /var/log/nginx/access.log --log-format=COMBINED -a -o /usr/local/nginx/html/index.html
vim /usr/local/nginx/conf/goaccess.conf
server  { 
        listen  7890;
        server_name 39.108.140.0;
        location / {
          root  /usr/local/nginx/html;
          try_files  $uri  $uri/  /index.html;
       }
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
}

# 訪問IP:7890,稍等片刻就會出現下面圖形

不同的輸出
# 輸出到終端且生成一個可交互的報告:
# 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 非常靈活,支持實時解析和過濾。例如:需要通過監控實時日志來快速診斷問題:
# 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 --line-buffered 'Firefox' | goaccess -o out.html --real-time-html -
實時HTML輸出

GoAccess 有能力在 HTML 報告中展示實時數據。您甚至可以通過電子郵件發送 HTML 報告,因為它是由沒有外部文件依賴的單個文件組成,是不是很酷!

# 生成實時 HTML 報告的過程和生成靜態報告的過程非常相似。實時報告僅僅需要使用參數 --real-time-html 。
# goaccess access.log -o /usr/share/nginx/html/site/report.html --real-time-html

# GoAccess 默認使用生成報告的主機名。您也可以指定 URL 用於客戶端瀏覽器訪問。參考 FAQ 上更詳細的示例。
 # goaccess access.log -o report.html --real-time-html --ws-url=goaccess.io

# GoAccess 默認偵聽端口 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
# 注意: 如果需要在加密連接上輸出實時數據,則需要使用 --ssl-cert=<cert.crt> 和 --ssl-key=<priv.key>。


# 源碼編譯nginx用默認配置,輸入下面命令即可實時查看nginx日志情況.
[root@server logs]# goaccess access.log -o ../html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED


免責聲明!

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



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