前言
GoAccess是一款开源轻量化的日志分析神器,它是一款基本终端的快速日志分析工具,核心功能是能够实时快速分析和查看 Web 服务器统计信息,最主要是针对中间件 ACCESS 访问日志来分析系统的行为,而无需使用浏览器,但它能够生成完整的,独立的实时 HTML 报告(非常适合分析,监控和数据可视化)以及 JSON 和 CSV 报告。这款工具能对大日志量文件进行分析,降低分析日志的难度,提升问题的定位效率。
介绍
GoAccess 是一个开源的实时网络日志分析器和交互式查看器,可以在Linux/Unix 系统中的终端或通过浏览器运行。它为需要动态可视化服务器报告的系统管理员提供快速且有价值的 HTTP 统计信息。
功能
- 快速, 实时, 毫秒/秒级更新, C 语言编写
- 仅依赖 ncurses 模块
- 几乎支持所有 Web 日志 格式 (Apache, Nginx, Amazon S3, Elastic Load Balancing, CloudFront, 等等)
- 简单设置即可支持自定义格式日志
- 漂亮的终端以及 bootstrap 风格控制面板 (易于将 GoAccess 调整为您自己的颜色搭配和风格)
- 支持 Valgrind 测试
操作手册
https://www.goaccess.cc/?mod=man
软件安装方式
部署依赖包
yum install glib2 glib2-devel GeoIP-devel ncurses-devel zlib zlib-devel gcc -y
yum -y install GeoIP-update
1、源码安装
# wget https://tar.goaccess.io/goaccess-1.6.1.tar.gz
# tar zxf goaccess-1.6.1.tar.gz && cd goaccess-1.6.1/
# ./configure --enable-utf8 --enable-geoip=mmdb
# make -j8 && make install
2、yum安装
# yum install goaccess -y
3、GitHub构建
$ git clone https://github.com/allinurl/goaccess.git
$ cd goaccess
$ autoreconf -fi
$ ./configure --enable-utf8 --enable-geoip=mmdb
$ make
# make install
配置
vim /etc/goaccess/goaccess.conf
将下列三行注释打开或配置:
time-format %T
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
配置文件参数说明
time-format:
后跟随一个空格符,指定日志的时间格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。
date-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)。
使用
控制台模式
goaccess -d -f /usr/local/nginx/logs/access.log -p /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 移动到最后一个模块底部
页面展示
Html浏览器模式
生成访问日志
将日志解析为Html格式并且导入到Nginx访问路径下
goaccess -f /usr/local/nginx/logs/access.log --log-format=COMBINED -a -o /usr/local/nginx/html/access.html
配置Nginx访问
vim /usr/local/nginx/conf/vhosts/goaccess.conf
server {
listen 7890;
server_name 1.1.1.1; # 自己主机的IP地址
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";
}
重启Nginx,访问7890
页面展示
实时Html报告
GoAccess 有能力在 HTML 报告中展示实时数据。您甚至可以通过电子邮件发送 HTML 报告,因为它是由没有外部文件依赖的单个文件组成,是不是非常强大!
操作
和生成静态报告非常类似,只需要加上一个参数即可:
goaccess -f /usr/local/nginx/logs/access.log -o /usr/local/nginx/html/access.html --real-time-html
其他操作
GoAccess默认使用生成报告的主机名,您可以指定URL用于客户端浏览器的访问
# 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>
不同输出方式
输出到终端且生成一个可交互的报告:
# 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 同时解析多个日志文件。最简单的方法是直接将多个文件通过命令行传给 GoAccess:
goaccess access.log access1.log
实时解析过滤
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 -