GoAccess - 可视化 Web 日志分析工具

GoAccess - 可视化 Web 日志分析工具。

在这里插入图片描述
官方地址: https://www.goaccess.cc/

一 语法

 goaccess [filename] [ options ... ] [-c][-M][-H][-q][-d][...]
 GoAccess 解析指定的 Web 日志文件并将统计结果输出到 X 终端。功能如下:

通用统计: 此面板展示了几个主要指标,比如:有效和无效请求的数量,分析这些数据所花费的时间,独立访客的情况,
请求的文件,静态文件(CSS, ICO, JPG 等)的完整URL,404错误,被解析的日志文件的大小以及消耗的带宽。

独立访客: 此面板按照日期展示了访问次数,独立访客数,以及累计消耗的带宽等指标。具有相同IP,相同访问时间,
相同的 UserAgent 的 HTTP 请求将会被识别为独立访客。默认情况下包含了网络爬虫。 
您也可以选择使用 --date-spec=hr 参数将按照日期分析修改为按照小时,例如:05/Jun/2019: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 内存哈希表
作为默认哈希表的替换方案。因为使用通用类型在内存表现以及速度方面都很平均。

二 编译安装

2.1 配置选项

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。

2.2 安装 GoAccess 只需要下载、解压以及编译就好了:

$ wget http://tar.goaccess.io/goaccess-1.2.tar.gz
$ tar -xzvf goaccess-1.2.tar.gz
$ cd goaccess-1.2/
#如果是https,则需要开启--with-openssl
$ ./configure --enable-utf8 --enable-geoip=legacy
$ make
#make install
2.3 在执行第四步./configure时,遇到问题:
configure: error: 
*** Missing development files for the GeoIP library
或者是这个错误
Missing development files for libmaxminddb library

原因: 未安装地理数据库导致的

解决方法:

$ wget https://github.com/maxmind/geoip-api-c/releases/download/v1.6.11/GeoIP-1.6.11.tar.gz
$ tar -xzvf GeoIP-1.6.11.tar.gz
$ cd GeoIP-1.6.11
$ ./configure
$ make
#make install

2.4 yum安装

[root@zheshiwode goaccess]# yum install goaccess
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * epel: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them.
The program yum-complete-transaction is found in the yum-utils package.
--> Running transaction check
---> Package goaccess.x86_64 0:1.2-1.el6 will be installed
--> Processing Dependency: libtokyocabinet.so.8()(64bit) for package: goaccess-1.2-1.el6.x86_64
--> Running transaction check
---> Package tokyocabinet.x86_64 0:1.4.33-6.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=========================================================================================================
 Package                     Arch                  Version                     Repository           Size
=========================================================================================================
Installing:
 goaccess                    x86_64                1.2-1.el6                   epel                220 k
Installing for dependencies:
 tokyocabinet                x86_64                1.4.33-6.el6                base                428 k

Transaction Summary
=========================================================================================================
Install       2 Package(s)

Total download size: 648 k
Installed size: 2.1 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): goaccess-1.2-1.el6.x86_64.rpm                                              | 220 kB     00:00     
(2/2): tokyocabinet-1.4.33-6.el6.x86_64.rpm                                       | 428 kB     00:00     
---------------------------------------------------------------------------------------------------------
Total                                                                    518 kB/s | 648 kB     00:01     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : tokyocabinet-1.4.33-6.el6.x86_64                                                      1/2 
  Installing : goaccess-1.2-1.el6.x86_64                                                             2/2 
  Verifying  : goaccess-1.2-1.el6.x86_64                                                             1/2 
  Verifying  : tokyocabinet-1.4.33-6.el6.x86_64                                                      2/2 

Installed:
  goaccess.x86_64 0:1.2-1.el6                                                                            

Dependency Installed:
  tokyocabinet.x86_64 0:1.4.33-6.el6                                                                     

Complete!

2.5 goaccess配置文件

[root@zheshiwode goaccess]# whereis goaccess
goaccess: /usr/bin/goaccess /etc/goaccess.conf /usr/share/man/man1/goaccess.1.gz

2.6 自定义 日志/日期格式设置

2.6.1 nginx中log_format启用

可以使用默认的格式
可以使用如下自定义的格式

 log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer"'
                   '"$http_user_agent" "$http_x_forwarded_for" '
                   '$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time'
                   '$bytes_sent $content_length  $request_length $upstream_response_length';
2.6.2 修改配置文件中goaccess.conf 以下项的内容
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

log-format中不需要nginx中的信息,可以用%^替换,如- 或者空格,如果出现:,则也需要用:替换
log-format与access.log log_format格式对应,每个参数用空格或制表符间隔
2.6.3 GoAccess 可以解析虚拟的任意 Web 日志格式。

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

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

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)
 
注意
针对 XFF, GoAccess 使用了一个特殊符号,即由一个波浪号+主机说明符构成,然后紧跟由大括号封装起来的 XFF
限定字段(例:~h{,"})。 
举例如下, ~h{," } 用于解析 "11.25.11.53, 17.68.33.17" 字段由一对双引号,一个逗号和一个空格限定。
 注意
为了得到平均,累计,最大处理时间,将需要开始在 Web 服务器中记录响应次数。
在 Nginx 中可以添加 $request_time 到日志格式中,或者 %D 在 Apache 中。
 重要
如果同时使用了多个处理时间的特殊说明符,则在格式字符串中第一个指定的选项具有最高优先级。

2.7 GoAccess 字段:

有效的 IPv4/6 地址 %h
有效的日期 %d
请求 %r
操作热键
F1 或 h主帮助页面。
F5重绘主窗口。
q退出程序,当前窗口或者崩溃了的模块。
o 或 ENTER扩展选中的模块或打开窗口。
0-9 和 Shift + 0激活选中的模块。
j在已扩展模块中向下滚动。
k在已扩展模块中向上滚动。
c设置或者改变配色方案。
^ f在当前模块中向前滚动一屏。
^ b在当前模块中向后滚动一屏。
TAB切换模块(向前)。
SHIFT + TAB切换模块(向后)。
s给活跃模块的选项排序。
/在所有模块中搜索(支持正则)。
n找到下次发生事件的位置。
g移动到第一个选项或者屏幕顶部。
G移动到第最后一个选项或者屏幕底部。

三 使用示例

不同的输出
输出到终端且生成一个可交互的报告:

 # 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
GGoAccess 非常灵活,支持实时解析和过滤。例如:需要通过监控实时日志来快速诊断问题:

 # 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 -
多日志文件
有多种方法可以实现让 GoAccess 同时解析多个日志文件。最简单的方法是直接将多个文件通过命令行传给 GoAccess:

 # goaccess access.log access.log.1
甚至在正常读取文件的时候也可以同时通过管道解析文件:

 # cat access.log.2 | goaccess access.log access.log.1 -
注意 添加到命令行末尾的破折号是为了告诉 GoAccess 应该从管道中读取数据。

要更加灵活的使用 GoAccess,我们可以使用一系列的管道。例如,我们希望处理所有压缩过的日志文件 access.log.*.gz 并附加到当前日志文件中,则我们可以这样做:

 # zcat access.log.*.gz | goaccess access.log -
注意: 在 Mac OS X 上, 请使用 gunzip -c 代替 zcat。

实时 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>。

日期处理
另一个强大的管道应该是从 Web 日志中过滤日期。

下面的命令将获取从 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 -
如果需要解析一个固定的时间段,则可以这样写:

 # sed -n '/5\/Nov\/2010/,/5\/Dec\/2010/ p' access.log | goaccess -a -
虚拟主机
假定您的日志中包含虚拟主机字段。比如:

 vhost.com:80 10.131.40.139 - - [02/Mar/2016:08:14:04 -0600] "GET /shop/bag-p-20 HTTP/1.1" 200 6715 "-" "Apache (internal dummy connection)"
并且您希望查看最高访问量的 URL 属于哪一台虚拟主机。

 awk '$8=$1$8' access.log | 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 -
服务器
值得一提的是,如果希望 GoAccess 运行在一个较低优先级,可以这样做:

 # nice -n 19 goaccess access.log -a
如果您不希望在服务器上安装 GoAccess,那在本地机器运行就好了:

 # ssh root@server 'cat /var/log/apache2/access.log' | goaccess -a -
处理不断增长中的日志
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
注意事项
每一个活动面板上最多有 366 个对象,如果是实时 HTML 报告则为 50 个对象。对象上限可以通过最大对象数自定义,
但是只有 CSV 和 JSON 格式的输出允许超过默认值,即 366 对象每面板。

在使用磁盘B+树(使用参数 --keep-db-files 和 --load-from-disk)加载了同一个日志两次,
则 GoAccess 会将每个请求也计算两次。问题#334 详细说明了此问题。

一次访问就是一次请求(访问日志中的每一行),例如,10 次请求 = 10 次访问。具有相同 IP,日期,
和 UserAgent 的 HTTP 请求将被认为是一个独立访问。

定时生成html文档

计划任务

0 0 1 * * goaccess -a -d -f /var/nginx/access.log -p /etc/goaccess.conf -o /var/nginx/goaccess.html 2> /var//nginx/goaccess.log

发布了77 篇原创文章 · 获赞 0 · 访问量 3232

猜你喜欢

转载自blog.csdn.net/liaowunonghen/article/details/104756227