GoAccess – 可视化 Web 日志分析工具
GoAccess 是什么?
GoAccess 是一款开源的且具有交互视图界面的实时 Web 日志分析工具,通过你的 Web 浏览器或者 *nix 系统下的终端程序(terminal)即可访问。
能为系统管理员提供快速且有价值的 HTTP 统计,并以在线可视化服务器的方式呈现。
功能特点?
支持几乎所有 Web 日志格式
GoAccess 允许任意自定义日志格式。 可预定义的格式包括: Apache, Nginx, Amazon S3, Elastic Load Balancing, CloudFront, 等等
完全实时
所有面板以及指标均按照指定时间间隔更新,在终端(Terminal)下是200ms,HTML则是每秒。
增长日志处理
需要持续保持数据?GoAccess 有能力处理在磁盘上以 B+Tree 数据库存储并且不断增长的日志。
仅依赖一个模块
GoAccess 是用 C 语言编写的。 仅仅需要 ncurses 这一个模块即可运行。同时 GoAccess 甚至还拥有自己的兼容 RFC6455 协议的 Web Socket 服务器。
易于使用
您可以直接运行 GoAccess 去处理您的访问日志文件,仅需选取日志格式然后让 GoAccess 解析日志内容并将统计结果展示出来。
还有许多功能想要多了解的话,可以参考官网:GoAccess – 中文站 – 可视化 Web 日志分析工具
编译安装
安装 GoAccess 非常的容易。只需要下载、解压以及编译就好了:
##下载地理数据库源码包,不然安装GoAccess 时会报错 [root@lavm-peaauoxaqf ~]# wget https://github.com/maxmind/geoip-api-c/releases/download/v1.6.11/GeoIP-1.6.11.tar.gz ##下载GoAccess 源码包 [root@lavm-peaauoxaqf ~]# wget http://tar.goaccess.io/goaccess-1.2.tar.gz ##下载编译安装所需要的依赖性 [root@lavm-peaauoxaqf ~]# yum install cmake make gcc ncurses-devel -y ##解压编译安装地理数据库 [root@lavm-peaauoxaqf ~]# tar xf GeoIP-1.6.11.tar.gz -C /usr/local/ [root@lavm-peaauoxaqf ~]# cd /usr/local/GeoIP-1.6.11/ [root@lavm-peaauoxaqf GeoIP-1.6.11]# ls aclocal.m4 bootstrap config.guess config.sub COPYING geoip.ico GeoIP.spec INSTALL libtool m4 Makefile.in missing README.OSX apps ChangeLog config.log configure data geoip.pc GeoIP.spec.in install-sh LICENSE Makefile Makefile.vc NEWS.md test AUTHORS compile config.status configure.ac depcomp geoip.pc.in get_ver.awk libGeoIP ltmain.sh Makefile.am man README.md test-driver [root@lavm-peaauoxaqf GeoIP-1.6.11]# ./configure [root@lavm-peaauoxaqf GeoIP-1.6.11]# make && make install ##解压编译安装goaccess [root@lavm-peaauoxaqf ~]# tar xzvf goaccess-1.2.tar.gz -C /usr/local/ [root@lavm-peaauoxaqf ~]# cd /usr/local/goaccess-1.2/ [root@lavm-peaauoxaqf goaccess-1.2]# cd /usr/local/goaccess-1.2/ [root@lavm-peaauoxaqf goaccess-1.2]# ls aclocal.m4 bin2c compile config.guess config.status configure COPYING goaccess INSTALL Makefile Makefile.in NEWS resources TODO AUTHORS ChangeLog config config.log config.sub configure.ac depcomp goaccess.1 install-sh Makefile.am missing README src [root@lavm-peaauoxaqf goaccess-1.2] # ./configure --enable-utf8 --enable-geoip=legacy [root@lavm-peaauoxaqf goaccess-1.2] # make && make install
编译安装nginx
##下载nginx源码包 [root@lavm-peaauoxaqf ~]# wget http://nginx.org/download/nginx-1.22.0.tar.gz ##安装编译nginx所需的依赖性 [root@lavm-peaauoxaqf ~]# yum install -y gcc pcre-devel openssl-devel ##解压源码包 [root@lavm-peaauoxaqf ~]# tar -zxvf nginx-1.22.0.tar.gz ##编译安装 [root@lavm-peaauoxaqf ~]# cd nginx-1.22.0 [root@lavm-peaauoxaqf nginx-1.22.0]# ls auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src [root@lavm-peaauoxaqf nginx-1.22.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module [root@lavm-peaauoxaqf nginx-1.22.0]# make && make install ##创建Nginx链接 [root@lavm-peaauoxaqf nginx-1.22.0]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/ ##检测配置文件启动nginx [root@lavm-peaauoxaqf ~]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@lavm-peaauoxaqf nginx-1.22.0]# nginx
##检测端口 [root@lavm-peaauoxaqf ~]# netstat -antlp | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15357/nginx: master
编译GoAccess 的可选配置
GoAccess 拥有多个配置选项。获取完整的最新配置选项列表,请运行:./configure –help
- –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。
自定义 日志/日期 格式
GoAccess 可以解析虚拟的任意 Web 日志格式。
预定义的选项包括:通用日志格式,联合日志格式,包含虚拟主机,W3C 格式以及亚马逊 CloudFront(分布式下载)。
GoAccess 允许任意的自定义格式字符串。
有两种方法配置日志格式。最简单的方式是运行 GoAccess 时使用
显示一个配置窗口。但是这种方式不是永久有效的,因此你需要在配置文件中设定格式。
配置文件位于:
或者
注意:
可能是
,
或者
time-format 参数 time-format 后跟随一个空格符,指定日志的时间格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。参考 `man strftime`。
或者
.
注意: 如果给定的时间戳以微秒计算,则必须在 time-format 中使用参数
。
date-format 参数 date-format 后跟随一个空格符,指定日志的日期格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。参考 `man strftime`。
注意: 如果给定的时间戳以微秒计算,则必须在 time-format 中使用参数
。
log-format 参数 log-format 后跟随一个空格符或者制表分隔符(
),用于指定日志字符串格式。
特殊格式说明符
-
%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,
%qand
%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)。
注意:针对 XFF, GoAccess 使用了一个特殊符号,即由一个波浪号+主机说明符构成,然后紧跟由大括号封装起来的 XFF 限定字段(例:~h{,”})。举例如下, ~h{,” } 用于解析 “11.25.11.53, 17.68.33.17” 字段由一对双引号,一个逗号和一个空格限定。
GoAccess 要求下列字段:
- 有效的 IPv4/6 地址
%h
- 有效的日期
%d
- 请求
%r
不同的输出
输出到终端且生成一个可交互的报告:
# 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 的配置文件 [root@lavm-peaauoxaqf goaccess-1.2]# vim /usr/local/etc/goaccess.conf 13 time-format %H:%M:%S 36 date-format %d/%b/%Y 64 log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u" ##生成交互式的报告 [root@lavm-peaauoxaqf goaccess-1.2]# goaccess -f /usr/local/nginx/logs/access.log Dashboard - Overall Analyzed Requests (01/Aug/2023 - 02/Aug/2023) [Active Panel: Visitors] Total Requests 202 Unique Visitors 32 Unique Files 25 Referrers 0 Valid Requests 202 Init. Proc. Time 0s Static Files 0 Log Size 38.02 KiB Failed Requests 0 Excl. IP Hits 0 Unique 404 15 Bandwidth 9.53 MiB Log Source /usr/local/nginx/logs/access.log > 1 - Unique visitors per day - Including spiders Total: 2/2 Hits h% Vis. v% Bandwidth Data ---- ------ ---- ------ ----------- ---- 84 41.58% 20 62.50% 5.48 MiB 02/Aug/2023 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 118 58.42% 12 37.50% 4.05 MiB 01/Aug/2023 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 2 - Requested Files (URLs) Total: 25/25 Hits h% Vis. v% Bandwidth Mtd Proto Data ---- ------ ---- ------ ----------- ---- -------- ---- 148 85.06% 31 93.94% 9.22 MiB GET HTTP/1.1 / 2 1.15% 0 0.00% 314.0 B --- --- PRI * HTTP/2.0 2 1.15% 0 0.00% 1.09 KiB POST HTTP/1.1 / 1 0.57% 1 3.03% 615.0 B GET HTTP/1.1 /?XDEBUG_SESSION_START=phpstorm 1 0.57% 0 0.00% 157.0 B --- --- \x16\x03\x01\x00{\x01\x00\x00w\x03\x03A\xCEL\xEA\x8Dv\x1CTx\xAF\xC6\x96\xCB\xE0\xAB\xE3\x03F\x85\x0B\xFA\xB9,\x85\xFC\xF95\xC8\xB5 1 0.57% 0 0.00% 157.0 B --- --- \x16\x03\x01\x00\xEE\x01\x00\x00\xEA\x03\x03\xEFG\xBC\x83\x8D\x18\x05\x1D\xBF<.v7\xCC\xBE\x12\xFF\xE9\xB2\xA5\x92\x08T \xABm\xF8\x 1 0.57% 0 0.00% 0.0 B --- --- 3 - Static Requests Total: 0/0 4 - Not Found URLs (404s) Total: 15/15 Hits h% Vis. v% Bandwidth Mtd Proto Data ---- ------ ---- ----- ----------- ---- -------- ---- 7 24.14% 0 0.00% 3.01 KiB GET HTTP/1.1 /favicon.ico 5 17.24% 0 0.00% 765.0 B POST HTTP/1.1 /HNAP1/ 3 10.34% 0 0.00% 1.63 KiB GET HTTP/1.1 /.env 2 6.90% 0 0.00% 708.0 B GET HTTP/1.1 /robots.txt 1 3.45% 0 0.00% 555.0 B GET HTTP/1.1 /console/ 1 3.45% 0 0.00% 555.0 B GET HTTP/1.1 /_ignition/execute-solution 1 3.45% 0 0.00% 153.0 B GET HTTP/1.1 /ip ........... [?] Help [Enter] Exp. Panel 0 - Wed Aug 2 10:58:02 2023
操作热键
-
F1
或
h主帮助页面。
-
F5
重绘主窗口。
-
q
退出程序,当前窗口或者崩溃了的模块。
-
o
或
ENTER扩展选中的模块或打开窗口。
-
0-9
和
Shift + 0激活选中的模块。
-
j
在已扩展模块中向下滚动。
-
k
在已扩展模块中向上滚动。
-
c
设置或者改变配色方案。
-
^ f
在当前模块中向前滚动一屏。
-
^ b
在当前模块中向后滚动一屏。
-
TAB
切换模块(向前)。
-
SHIFT + TAB
切换模块(向后)。
-
s
给活跃模块的选项排序。
-
/
在所有模块中搜索(支持正则)。
-
n
找到下次发生事件的位置。
-
g
移动到第一个选项或者屏幕顶部。
-
G
移动到第最后一个选项或者屏幕底部。
生成静态html文件并配置nginx浏览器界面访问
##编辑nginx配置文件 [root@lavm-peaauoxaqf ~]# cd /usr/local/nginx/conf/ [root@lavm-peaauoxaqf ~]# vim nginx.conf 43 location / { 44 root /usr/local/nginx/html; 45 index report.html index.html index.htm; 46 47 } ##将日志分析结果输出到nginx的默认发布目录html中,由access.log文档转换为report.html文档。 [root@lavm-peaauoxaqf ~]# goaccess -f /usr/local/nginx/logs/access.log -a -o /usr/local/nginx/html/report.html ##检测配置文件重新启动nginx [root@lavm-peaauoxaqf ~]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@lavm-peaauoxaqf nginx-1.22.0]# nginx
##检测端口 [root@lavm-peaauoxaqf ~]# netstat -antlp | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15357/nginx: master
浏览器输入IP进行访问(注意防火墙及端口是否开放)
配置生成动态实时的html报告,浏览器界面访问
在之前配置好goaccess后,在浏览器访问到的数据是不变的,更新时间会一直停留在第一次访问的时间。这是因为之前导入到html中的静态文件report.html一旦生成就不会发生变化,所以导致浏览器访问到的数据不会实时更新。这时候我们就要设置成daemonize模式运行,通过监听websocket的7890来获取实时更新的数据。
服务器选项
- –addr=<address>将服务器绑定到指定 IP 地址。默认绑定到 0.0.0.0 。通常无需指定,除非您希望将服务器绑定到主机上的其他地址。
- –daemonize使 GoAccess 作为守护程序运行(仅在 –real-time-html 开启下有效)。
- –origin=<url>E在 WebSocket 握手中确保客户端发送指定的源头。且指定的源应与浏览器发送源头字段完全相同。例如:
--origin=http://goaccess.io
- –port=<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 时有效
文件选项
- -f –log-file=<logfile>指定输入日志文件的路径。如果在配置文件中指定了输入文件,则其优先级要高于在命令行中通过
-f
参数指定。
- -l –log-debug=<filename>发送所有调试信息到指定文件。需要指定配置选项
--enable-debug
- -p –config-file=<configfile>指定使用自定义配置文件。如果设置了此参数,其优先级将高于全局配置文件(如果有)。
- –invalid-requests=<filename>记录无效请求到指定文件。
- –no-global-config禁止加载全局配置文件。可能的目录应该是
/usr/etc/
,
/etc/或者
/usr/local/etc/, 除非在运行 ./configure 时指定了
--sysconfdir=/dir。
日志/日期/时间 格式
- –time-format <timeformat>参数 time-format 后跟随一个空格符,指定日志的时间格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。参考 `man strftime`。 %T 或者 %H:%M:%S.
- –date-format <dateformat>参数 date-format 后跟随一个空格符,指定日志的日期格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。参考 `man strftime`。
- –log-format <logformat>参数 log-format 后跟随一个空格符或者制表分隔符(
\t
),用于指定日志字符串格式。另外可以指定原始 日志/日期/时间 格式,简单来说,下表中的预定义日志格式名称可以用作 日志/日期/时间 格式的变量。GoAccess 可以处理在一个变量中处理一个预定义名称,而在另一变量中处理另外一个预定义名称。
COMBINED | 联合日志格式 VCOMBINED | 支持虚拟主机的联合日志格式 COMMON | 通用日志格式 VCOMMON | 支持虚拟主机的通用日志格式 W3C | W3C 扩展日志格式 SQUID | Native Squid 日志格式 CLOUDFRONT | 亚马逊 CloudFront Web 分布式系统 CLOUDSTORAGE | 谷歌云存储 AWSELB | 亚马逊弹性负载均衡 AWSS3 | 亚马逊简单存储服务 (S3)
注意: 一般来说,需要在包含空格、逗号、管道符、引号、/、括号的值的周围引用引号。内部引号必须进行转义处理。
注意: 使用管道传送数据给 GoAccess 时不会提示 日志/日期/时间 配置对话框,你需要在配置文件或者命令行中提前定义。
使用daemonize守护程序运行,生成实时HTML报告的过程与创建静态报告的过程非常相似,只需要在启动命令后指定日志格式–log-format=COMBINED(我这里指定的是COMBINED联合日志格式),添加–real-time-html和–daemonize参数即可
[root@lavm-peaauoxaqf ~]# goaccess /usr/local/nginx/logs/access.log -o /usr/local/nginx/html/report.html --log-format=COMBINED --real-time-html --daemonize Daemonized GoAccess: 18072 ##查看7890端口 [root@lavm-peaauoxaqf ~]# netstat -antlp | grep 7890 tcp 0 0 0.0.0.0:7890 0.0.0.0:* LISTEN 18072/goaccess