1、GoAccess是什么

GoAccess 是一款开源的且具有交互视图界面的实时 Web 日志分析工具,通过你的 Web 浏览器或者 *nix 系统下的终端程序(terminal)即可访问。
能为系统管理员提供快速且有价值的 HTTP 统计,并以在线可视化服务器的方式呈现。

2、为什么要用GoAccess

GoAccess 被设计成快速的并基于终端的日志分析工具。其核心理念是不需要通过 Web 浏览器就能快速分析并实时查看 Web 服务器的统计数据(这对于需要使用 SSH 来对访问日志进行快速分析或者就是喜欢在终端环境下工作的人来说是超赞的)。
终端输出仅仅是默认的输出方式,GoAccess 还支持生成完整的实时 HTML 报告(这对分析、监控以及数据可视化都是极好的),以及 JSON 和 CSV 格式的报告。

3、GoAccess功能

GoAccess 解析指定的 Web 日志文件并将统计结果输出到 X 终端。功能如下:

  • 通用统计: 此面板展示了几个主要指标,比如:有效和无效请求的数量,分析这些数据所花费的时间,独立访客的情况,请求的文件,静态文件(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。

4、GoAccess特点

  • 完全实时: 所有面板以及指标均按照指定时间间隔更新,在终端(Terminal)下是200ms,HTML则是每秒。
  • 支持几乎所有 Web 日志格式: GoAccess 允许任意自定义日志格式。 可预定义的格式包括: Apache, Nginx, Amazon S3, Elastic Load Balancing, CloudFront, 等等
  • 跟踪应用响应时间: 跟踪处理请求的时间消耗。对于解决站点页面访问速度下降非常有用。
  • 增长日志处理: 需要持续保持数据?GoAccess 有能力处理在磁盘上以 B+Tree 数据库存储并且不断增长的日志。
  • 仅依赖一个模块: GoAccess 是用 C 语言编写的。 仅仅需要 ncurses 这一个模块即可运行。同时 GoAccess 甚至还拥有自己的兼容 RFC6455 协议的 Web Socket 服务器。
  • 易于使用: 可以直接运行 GoAccess 去处理您的访问日志文件,仅需选取日志格式然后让 GoAccess 解析日志内容并将统计结果展示出来。
  • 访客画像: 可以按照小时或者指定日期确定最慢请求的访问次数,访客数量,带宽以及其他相关度量值。
  • 支持虚拟主机: 拥有多个虚拟主机?在控制面板中能够显示出哪一个虚拟主机消耗 Web 服务器上最多的资源。
  • 配色风格可定制化: GoAccess 的配色风格十分易于定制化。无论是通过终端,还是仅仅通过简单修改 HTML 页面的层叠样式表。

5、安装GoAccess

安装有两种方式:源码编译安装和yum安装
本机环境

# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

5.1、源码安装

下载包并编译

# wget -c https://tar.goaccess.io/goaccess-1.3.tar.gz
# tar -xzvf goaccess-1.3.tar.gz
# cd goaccess-1.3/
# ./configure --prefix=/usr/local/goaccess --enable-utf8 --enable-geoip=legacy --with-openssl

根据错误提示依次解决依赖关系
报错一:

configure: error: 
    *** Missing development files for the GeoIP library
# yum install -y GeoIP-devel

报错二:

configure: error: *** Missing development libraries for ncursesw
# yum install -y ncurses-devel

再次编译安装

# ./configure --prefix=/usr/local/goaccess --enable-utf8 --enable-geoip=legacy --with-openssl
...
Your build configuration:

  Prefix         : /usr/local/goaccess
  Package        : goaccess
  Version        : 1.3
  Compiler flags :  -pthread
  Linker flags   : -lnsl -lncursesw -lGeoIP -lcrypto -lssl -lpthread  
  Dynamic buffer : no
  Geolocation    : GeoIP Legacy
  Storage method : In-memory Hash Database (Default)
  TLS/SSL        : yes
  Bugs           : goaccess@prosoftcorp.com
# make && make install
...
make[3]: Entering directory `/root/goaccess-1.3'
 /usr/bin/mkdir -p '/usr/local/goaccess/bin'
  /usr/bin/install -c goaccess '/usr/local/goaccess/bin'
 /usr/bin/mkdir -p '/usr/local/goaccess/etc/goaccess'
 /usr/bin/install -c -m 644 config/goaccess.conf config/browsers.list '/usr/local/goaccess/etc/goaccess'
 /usr/bin/mkdir -p '/usr/local/goaccess/share/man/man1'
 /usr/bin/install -c -m 644 goaccess.1 '/usr/local/goaccess/share/man/man1'
make[3]: Leaving directory `/root/goaccess-1.3'
make[2]: Leaving directory `/root/goaccess-1.3'
make[1]: Leaving directory `/root/goaccess-1.3'

5.2、yum安装

通过yum安装可以自动的解决依赖问题

# yum install goaccess -y

6、配置

  • 配置环境变量
# echo "export PATH=/usr/local/goaccess/bin:$PATH" >>/etc/profile
# source /etc/profile
# goaccess -V
GoAccess - 1.3.
For more details visit: http://goaccess.io
Copyright (C) 2009-2016 by Gerardo Orellana

Build configure arguments:
  --enable-utf8
  --enable-geoip=legacy
  --with-openssl
  • 自定义日志/日期格式

GoAccess可以解析虚拟的任意Web日志格式。
预定义的选项包括:通用日志格式,联合日志格式,包含虚拟主机,W3C格式以及亚马逊CloudFront(分布式下载)。
GoAccess允许任意的自定义格式字符串。

有两种方法配置日志格式。最简单的方式是运行 GoAccess时使用-c显示一个配置窗口。但是这种方式不是永久有效的,因此你需要在配置文件中设定格式。

配置文件位于:%sysconfdir%/goaccess.conf 或者~/.goaccessrc
注意:%sysconfdir%可能是/etc/, /usr/etc/或者/usr/local/etc/

time-format参数time-format后跟随一个空格符,指定日志的时间格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号(%)开始。参考 man strftime%T或者%H:%M:%S.
注意: 如果给定的时间戳以微秒计算,则必须在 time-format中使用参数%f

date-format 参数 date-format 后跟随一个空格符,指定日志的日期格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。参考 man strftime
注意: 如果给定的时间戳以微秒计算,则必须在 time-format中使用参数%f

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)。

  • 修改配置文件

# vim /usr/local/goaccess/etc/goaccess/goaccess.conf
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

本文示例用来分析nginx的日志,为了分析的精准度,配置一下nginxlog_format为通用格式

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_cookie" "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

7、使用

常用参数说明

  • -a --agent-list 启用由主机用户代理的列表。为了更快的解析,不启用该项
  • -d --with-output-resolver 在HTML/JSON输出中开启IP解析,会使用GeoIP来进行IP解析
  • -f --log-file 需要分析的日志文件路径
  • -p --config-file 配置文件路径
  • -o --output 输出格式,支持html、json、csv
  • -m --with-mouse 控制面板支持鼠标点击
  • -q --no-query-string 忽略请求的参数部分
  • --real-time-html 实时生成HTML报告
  • --daemonize 守护进程模式,--real-time-html时使用

7.1、控制台模式

# pwd
/var/log/nginx
# goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf

控制台操作方法按键

  • F1 主帮助页面
  • F5 重绘主窗口
  • q 退出
  • 1-15 跳转到对应编号的模块位置
  • o 打开当前模块的详细视图
  • j 当前模块向下滚动
  • k 当前模块向上滚动
  • s 对模块排序
  • / 在所有模块中搜索匹配
  • n 查找下一个出现的位置
  • g 移动到第一个模块顶部
  • G 移动到最后一个模块底部

效果如下

7.2、HTML模式

# pwd
/var/log/nginx
# goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf -o /usr/local/nginx/html/www.ssgeek.com/go-access.html
Parsing... [9,692] [692/s]s]

此处生成的html直接定向到了站点目录下,因此分析并生成html文件后即可进行访问,不多说此处上大图!

7.3、守护进程模式

使用daemonize模式运行,生成实时HTML报告的过程与创建静态报告的过程非常相似,只需要在启动命令后添加--real-time-html--daemonize参数即可

# goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf -o /usr/local/nginx/html/www.ssgeek.com/go-access.html --real-time-html --daemonize
Daemonized GoAccess: 13308

默认监听的是7890端口,可以使用--port指定端口号启动后会提示WebSocket服务器已准备接收来自客户的连接

# netstat -lntup|grep 7890
tcp        0      0 0.0.0.0:7890            0.0.0.0:*               LISTEN      13333/goaccess

如果网站开启了HTTPS功能,就需要GoAccess启用openssl,在配置文件goaccess.conf中配置ssl-certssl-key来支持openssl,还需要将ws-url指定为https的域名

7.4、定时更新

也可以通过定时任务的方式实现定时更新HTML报表,每30分钟刷新一次

# crontab -e
*/30 * * * * goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf -o /usr/local/nginx/html/www.ssgeek.com/go-access.html

7.5、处理不断增长的日志

处理不断增长的日志指的是当日志按照某些规则进行切割,例如nginx日志每天切割一份的情况。这个时候GoAccess通过磁盘B+树数据库能够处理不断增长的日志。工作原理如下:

  • 首先数据集必须使用 --keep-db-files, 参数保存,然后相同的数据集可以使用参数 --load-from-disk 载入。
  • 收到新的数据(来自管道或者文件)后,将会被附加到原始数据集上。
  • 在任何时候都保存数据, 则必须使用 --keep-db-files 参数。
  • 如果在使用参数 --load-from-disk 时没有同时使用 --keep-db-files 参数,则数据库文件在程序关闭时将会被删除。

示例:

// 上个月的访问日志
goaccess access.log.1 --keep-db-files

然后,载入

// 添加这个月的新日志,并保存为新数据
goaccess access.log --load-from-disk --keep-db-files

读取已经保存的数据(不解析新数据)

goaccess --load-from-disk --keep-db-files

7.6、其他使用

  • 生成 JSON 报告
# goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf -o json > report.json
  • 生成 CSV 文件
# goaccess -a -d -f nginx_access.log-20191216 -p /usr/local/goaccess/etc/goaccess/goaccess.conf -o csv > report.csv
  • 实施过滤和解析
# tail -f nginx_access.log | goaccess -p /usr/local/goaccess/etc/goaccess/goaccess.conf -
  • 分析多个文件
# goaccess -p /usr/local/goaccess/etc/goaccess/goaccess.conf access.log.1 access.log.2

参考:
https://goaccess.cc/
https://github.com/allinurl/goaccess