GoAccess - 可视化 Web 日志分析工具。
goaccess [filename] [ options ... ] [-c][-M][-H][-q][-d][...]
GoAccess 是一款开源(MIT许可证)的且具有交互视图界面的实时 Web 日志分析工具,通过你的 Web 浏览器或者 *nix 系统下的终端程序即可访问。
能为系统管理员提供快速且有价值的 HTTP 统计,并以在线可视化服务器的方式呈现。 GoAccess 解析指定的 Web 日志文件并将统计结果输出到 X 终端。功能如下:
JPG
, CSS
, SWF
, JS
, GIF
, 和 PNG
, 以及和上一个面板一样的其他指标。 另外静态文件可以被添加到配置文件中。
`--ignore-panel`
开启此功能。(默认关闭)
`--ignore-panel`
开启此功能。(默认关闭)
%e
。
注意: 如果配置了可选项,所有面板将显示处理请求的平均时间消耗。
GoAccess 支持三种类型的存储方式。请根据你的需要和系统环境进行选择。
内存哈希表可以提供较好的性能,缺点是数据集的大小受限于物理内存的大小。GoAccess 默认使用内存哈希表。如果你的内存可以装下你的数据集,那么这种模式的表现非常棒。此模式具有非常好的内存利用率和性能表现。
使用这种模式来处理巨大的数据集,大到不可能在内存中完成任务。当数据提交到磁盘以后,B+树数据库比任何一种哈希数据库都要慢。但是,使用 SSD 可以极大的提高性能。往后您可能需要快速载入保存的数据,那么这种方式就可以被使用。
作为默认哈希表的替换方案。因为使用通用类型在内存表现以及速度方面都很平均。
GoAccess 拥有多个配置选项。获取完整的最新配置选项列表,请运行:./configure --help
--enable-debug
--enable-utf8
--enable-geoip=<legacy|mmdb>
legacy
将使用原始 GeoIP 数据库。 mmdb
将使用增强版 GeoIP2 数据库。--enable-tcb=<memhash|btree>
memhash
将使用 Tokyo Cabinet 的内存哈希数据库。btree
将使用 Tokyo Cabinet 的磁盘 B+Tree 数据库。--disable-zlib
--disable-bzip
--with-getline
--with-openssl
下面的选项可以通过命令行使用,如果是长选项则通过配置文件。
参数 time-format 后跟随一个空格符,指定日志的时间格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。参考 `man strftime`。 %T 或者 %H:%M:%S.
参数 date-format 后跟随一个空格符,指定日志的日期格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。参考 `man strftime`。
参数 log-format 后跟随一个空格符或者制表分隔符(\t
),用于指定日志字符串格式。
另外可以指定原始 日志/日期/时间 格式,简单来说,下表中的预定义日志格式名称可以用作 日志/日期/时间 格式的变量。GoAccess 可以处理在一个变量中处理一个预定义名称,而在另一变量中处理另外一个预定义名称。
COMBINED | 联合日志格式 VCOMBINED | 支持虚拟主机的联合日志格式 COMMON | 通用日志格式 VCOMMON | 支持虚拟主机的通用日志格式 W3C | W3C 扩展日志格式 SQUID | Native Squid 日志格式 CLOUDFRONT | 亚马逊 CloudFront Web 分布式系统 CLOUDSTORAGE | 谷歌云存储 AWSELB | 亚马逊弹性负载均衡 AWSS3 | 亚马逊简单存储服务 (S3)
注意: 一般来说,需要在包含空格、逗号、管道符、引号、/、括号的值的周围引用引号。内部引号必须进行转义处理。
注意: 使用管道传送数据给 GoAccess 时不会提示 日志/日期/时间 配置对话框,你需要在配置文件或者命令行中提前定义。
在程序开始运行时显示 日志/日期 配置窗口。
颜色高亮活动面板。
在主仪表盘面板使能鼠标支持。
使用终端输出时指定自定义颜色。
颜色语法:
DEFINITION space/tab colorFG#:colorBG# [attributes,PANEL]
FG# = 前景色 [-1...255] (-1 = 默认配色) BG# = 背景色 [-1...255] (-1 = 默认配色)
使用如下方式应用颜色属性也是允许的(多个属性使用逗号分隔),例如:
bold,underline,normal,reverse,blink
如果喜欢,可以为同一个指标在不同面板设置不同颜色,比如一个指标在页面请求面板使用颜色A,同时在浏览器面板则显示颜色B。
请查阅配置文件中颜色方案示例。
选择终端配色方案。1
为单色方案。2
为绿色方案以及 3
为 Monokai 方案(需终端支持 256 色)。
仅解析和显示爬虫(机器人)。
在 HTML 报告中按照指定的自定义 CSS 文件路径加载 CSS 样式。
在 HTML 报告中按照指定的自定义 JS 文件路径加载 JS 代码。
设定 HTML 报告页面的标题和头部内容。
设定 HTML 报告的默认参数。通过提交一个有效的包含相关参数的 JSON 对象来设置。允许用户为每一个面板单独设置。参考如下示例。
--html-prefs='{"theme":"bright","perPage":5,"layout":"horizontal","showTables":true,"visitors":{"plot":{"chartType":"bar"}}}'注意: 提交的 JSON 对象必须保存在一行 JSON 字符串中。
使用制表符和新行格式化 JSON 输出。
设置每个面板最多可以显示的单元个数。取值范围是 1 到 n。
注意: 仅 CSV 和 JSON 格式的报告允许大于默认值 366 个单元每面板(或者 50 个在实时 HTML 报告中)。
关闭颜色输出。此选项在不支持色彩的终端上为默认选项。
在终端输出中不显示列名。默认在每一个面板的每一个有效指标都会显示列名。
在 CSV 格式输出中禁止汇总指标。
解析日志时不显示进度指标[总请求数/每秒请求数]。
禁止通过 TAB 键滚动面板或者使用数字键选择面板。
在生成的 HTML 报告中不显示“最近更新”。
将服务器绑定到指定 IP 地址。默认绑定到 0.0.0.0 。
通常无需指定,除非您希望将服务器绑定到主机上的其他地址。
使 GoAccess 作为守护程序运行(仅在 --real-time-html 开启下有效)。
E在 WebSocket 握手中确保客户端发送指定的源头。且指定的源应与浏览器发送源头字段完全相同。例如:--origin=http://goaccess.io
指定服务使用的端口。GoAccess 默认使用端口 7890 作为 WebSocket 服务器。请确保此端口可用。
使能实时 HTML 报告。
此 URL 用于 WebSocket 服务器的回应。用于客户端侧的 WebSocket 构建器。
同时可以选择指定 WebSocket 的 URI 协议,比如:ws://
用于非加密连接, 以及 wss://
用于加密连接。示例:wss://goaccess.io
如果 GoAccess 运行在代理服务器的后面,您需要通过在主机名后跟随冒号加端口号的方式让客户端连接到另外一个不同的端口。示例:goaccess.io:9999
默认情况下,会尝试去连接生成报告的主机名。如果 GoAccess 运行在一台远程服务器上,则远程主机名也应该在 URL 中指定。当然,必须保证主机是有效的。
创建一个管道(先入先出)从指定的路径/文件读取数据。
创建一个管道(先入先出)往指定的路径/文件写入数据。
指定 TLS/SSL 证书的路径。使 GoAccess 支持 TLS/SSL,需要使用参数 --ssl-cert
和 --ssl-key
。
仅在使用了参数 --with-openssl 时有效
指定 TLS/SSL 私钥的路径。使 GoAccess 支持 TLS/SSL,需要使用参数 --ssl-cert
和 --ssl-key
。
仅在使用了参数 --with-openssl 时有效
指定输入日志文件的路径。如果在配置文件中指定了输入文件,则其优先级要高于在命令行中通过 -f
参数指定。
发送所有调试信息到指定文件。需要指定配置选项 --enable-debug
指定使用自定义配置文件。如果设置了此参数,其优先级将高于全局配置文件(如果有)。
记录无效请求到指定文件。
禁止加载全局配置文件。可能的目录应该是 /usr/etc/
, /etc/
或者
/usr/local/etc/
, 除非在运行 ./configure 时指定了 --sysconfdir=/dir
。
开启 UserAgent 列表。开启后会降低解析速度。
输出 HTML
或者 JSON
报告时开启 IP 解析。
排除一个 IPv4 或者 IPv6 地址。 使用连接符表示 IP 段(开始-结束)。
HTTP 请求协议开关。将创建一个请求字段包含请求协议+真实请求。
HTTP 请求方法开关。将创建一个请求字段包含请求方法+真实请求。
将给定文件重定向到标准输出,通过后缀名决定输出格式:
忽略请求的查询字符串。即: www.google.com/page.htm?query => www.google.com/page.htm
注意: 去掉查询字符串将极大降低内存消耗,特别对带时间戳的请求。
在终端输出时禁止 IP 解析。
将非标准状态 444 作为 404 处理。
将 4xx 客户端错误数加到独立访客数中。
统计包含查询字符串的静态文件。
设置日期的显示格式,一种是标准日期格式(默认),一种是日期后附加小时的格式。
仅在访客面板有效。对于在小时级别分析访客数据很有帮助。显示格式示例:18/Dec/2010:19
解码双重编码的值。包括 UserAgent,Request 以及 Referer。
开启指定面板。面板列表:
设定时间的显示格式,一种是标准时间格式(默认),一种是时间后附加分钟数(每十分钟)的格式。
用于时间分布面板。对于在特定时间段分析流量峰值很有用处。
忽略爬虫。
忽略指定面板。面板列表:
忽略被统计的来路。支持通配符。例如: *.domain.com
ww?.domain.*
忽略解析或者显示一个或者多个状态码。如果有多个状态码,使用此参数每次指定一个。
设定测试行数,即使用给定的 日志/日期/时间 格式测试访问日志。默认值为 10 行。如果设置为 0 ,解析器不会做任何测试而是直接解析整个文件。如果在达到 number
之前,有一行匹配上了给定的 日志/日期/时间 格式,则解析器会认为日志文件是有效的,否则 GoAccess 会返回 EXIT_FAILURE
并显示相关的错误信息。
解析日志,且退出时不输出数据。主要用于仅希望往磁盘数据库中添加数据而无需输出报告时使用。
显示真实的操作系统名称。例如: Windows XP, Snow Leopard.
S在初始化载入是对面板进行排序。排序选项使用逗号分隔。选项使用这样的格式:PANEL,METRIC,ORDER
可用指标
添加静态文件后缀名。例如:.mp3
。 后缀名区分大小写。
标准 GeoIP 数据库,低内存占用。
设定 GeoIP 数据库路径。例如:GeoLiteCity.dat。需要从 maxmind.com 上下载到本地。IPv4 和 IPv6 均可用支持。注意:--geoip-city-data
是 --geoip-database
的别名。
注意: 如果使用 GeoIP2,您需要从 MaxMind 下载 城市/国家 数据库,并通过 --geoip-database
设定。
查看帮助信息。
显示版本信息并退出。
显示当前存储方法。比如:B+ Tree, Hash。
显示默认配置文件的路径,如果没有使用 -p
指定。
在磁盘上保存已解析的数据。如果数据库文件存在,则文件将被覆盖。此参数应用于第一个数据集。如果设置此参数为 false 则在退出程序时将删除所有数据库。示例见下文。
仅在设置了 --enable-tcb=btree 时有效。
从磁盘载入之前存储过的数据。如果仅读取已保存的数据,则需要退出数据库文件。参考 keep-db-files
即相关示例见下文。
仅在设置了 --enable-tcb=btree 时有效。
设置磁盘数据库文件的存储路径。默认值为 /tmp
目录。
仅在设置了 --enable-tcb=btree 时有效。
设置附加内存映射的大小,单位为字节。默认值为0。
仅在设置了 --enable-tcb=btree 时有效。
指定被缓存的最大叶子节点数目。如果取值小于 0,则使用默认值。默认值为 1024。设定较大的值以获得较快的处理速度,同时会增加内存消耗。较小的值则会降低内存消耗。
仅在设置了 --enable-tcb=btree 时有效。
指定被缓存的最大非叶子节点数目。如果取值小于 0,则使用默认值。默认值为 512。
仅在设置了 --enable-tcb=btree 时有效。
指定每一个叶子页面的成员数量。如果取值小于 0,则使用默认值。默认值为 128。
仅在设置了 --enable-tcb=btree 时有效。
指定每一个非叶子页面的成员数量。如果取值小于 0,则使用默认值。默认值为 256。
仅在设置了 --enable-tcb=btree 时有效。
指定每个 Bucket 组的元素数量。如果取值小于 0,则使用默认值。默认值为 32749。建议 Bucket 组大小的取值为已保存页面数的 1 到 4 倍。
仅在设置了 --enable-tcb=btree 时有效。
指定页面采用的压缩编码(ZLIB|BZ2)。
仅在设置了 --enable-tcb=btree 时有效。
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)。
~h{,"}
)。
~h{," }
用于解析 "11.25.11.53, 17.68.33.17"
字段由一对双引号,一个逗号和一个空格限定。
$request_time
到日志格式中,或者 %D
在 Apache 中。
GoAccess 要求下列字段:
%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
。
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 请求将被认为是一个独立访问。
如果您认为您发现了一个 Bug,请发送电子邮件到
Gerardo Orellana. 获取更多信息以及最新软件版本,请访问 https://goaccess.io