GoAccess 是一个开源实时 Web 日志分析器和交互式查看器,可在 *nix 系统上的终端中或通过浏览器运行。它为需要动态可视化服务器报告的系统管理员提供快速且有价值的 HTTP 统计信息。更多信息请访问:https://goaccess.io。
GoAccess解析指定的Web日志文件并将数据输出到X终端。特点包括:
完全实时
所有面板和指标都定时在终端输出上每 200 毫秒更新一次,在 HTML 输出上每秒更新一次。
所需的最低配置
您只需针对访问日志文件运行它,选择日志格式,然后让 GoAccess 解析访问日志并向您显示统计信息。
跟踪应用程序响应时间
跟踪处理请求所花费的时间。如果您想跟踪减慢网站速度的页面,则非常有用。
几乎所有网络日志格式
GoAccess 允许任何自定义日志格式字符串。预定义选项包括 Apache、Nginx、Amazon S3、Elastic Load Balancing、CloudFront 等。
增量日志处理
需要数据持久化? GoAccess 能够通过磁盘持久性选项增量处理日志。
只有一个依赖
GoAccess 是用 C 语言编写的。要运行它,您只需要 ncurses 作为依赖项。就是这样。它甚至拥有自己的 Web Socket 服务器 — http://gwsocket.io/。
访客
按小时或日期确定点击量、访问者、带宽和最慢运行请求的指标。
每个虚拟主机的指标
拥有多个虚拟主机(服务器块)?它有一个面板,显示哪个虚拟主机消耗了大部分 Web 服务器资源。
ASN(自治系统编号映射)
非常适合检测恶意流量模式并相应地阻止它们。
配色方案可定制
定制 GoAccess 以适合您自己的颜色品味/方案。通过终端,或者简单地在 HTML 输出上应用样式表。
支持大型数据集
由于其优化的内存哈希表,GoAccess 具有解析大型日志的能力。它具有非常好的内存使用率和相当好的性能。该存储还支持磁盘持久性。
Docker 支持
能够从上游构建 GoAccess 的 Docker 映像。您仍然可以通过使用卷映射和编辑goaccess.conf
来完全配置它。请参阅下面的 Docker 部分。
GoAccess 允许任何自定义日志格式字符串。预定义选项包括但不限于:
GoAccess 被设计为一个快速的、基于终端的日志分析器。其核心思想是快速实时分析和查看 Web 服务器统计数据,而无需使用浏览器(如果您想通过 SSH 快速分析访问日志,或者如果您只是喜欢在终端中工作,那么这非常有用)。
虽然终端输出是默认输出,但它能够生成完整、独立的实时HTML
报告以及JSON
和CSV
报告。
您可以将其视为一个监视命令工具而不是其他任何工具。
GoAccess可以在*nix系统上编译和使用。
下载、解压并编译 GoAccess:
$ wget https://tar.goaccess.io/goaccess-1.9.3.tar.gz
$ tar -xzvf goaccess-1.9.3.tar.gz
$ cd goaccess-1.9.3/
$ ./configure --enable-utf8 --enable-geoip=mmdb
$ make
# make install
$ git clone https://github.com/allinurl/goaccess.git
$ cd goaccess
$ autoreconf -fiv
$ ./configure --enable-utf8 --enable-geoip=mmdb
$ make
# make install
使用 GNU+Linux 发行版的首选包管理器在 GNU+Linux 上安装 GoAccess 是最简单的。请注意,并非所有发行版都会提供最新版本的 GoAccess。
# apt-get install goaccess
注意:这可能会安装过时版本的 GoAccess。为了确保您运行的是最新稳定版本的 GoAccess,请参阅下面的替代选项。
$ wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
$ echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
$ sudo apt-get update
$ sudo apt-get install goaccess
笔记:
.deb
包也可以通过 HTTPS 获取。您可能需要安装apt-transport-https
。 # yum install goaccess
# pacman -S goaccess
# emerge net-analyzer/goaccess
# brew install goaccess
# cd /usr/ports/sysutils/goaccess/ && make install clean
# pkg install sysutils/goaccess
# cd /usr/ports/www/goaccess && make install clean
# pkg_add goaccess
# zypper ar -f obs://server:http http
# zypper in goaccess
# pkg install goaccess
# pkgin install goaccess
GoAccess 可以通过 Cygwin 在 Windows 中使用。请参阅 Cygwin 的软件包。或者通过 Windows 10 上的 GNU+Linux 子系统。
GoAccess 的要求极低,它是用 C 语言编写的,仅需要 ncurses。不过,下表列出了一些发行版中用于从源代码构建 GoAccess 的一些可选依赖项。
发行版 | NCurses | GeoIP(可选) | GeoIP2(可选) | OpenSSL(可选) |
---|---|---|---|---|
Ubuntu/Debian | libncurses-dev | libgeoip-dev | libmaxminddb-dev | libssl 开发 |
RHEL/CentOS | ncurses-开发 | 地理开发 | libmaxminddb-开发 | openssl 开发 |
拱 | 恩诅咒 | 地理信息 | libmaxminddb | 开放式SSL |
根图 | 系统库/ncurses | 开发库/geoip | 开发库/libmaxminddb | 开发库/openssl |
斯莱克软件 | 恩诅咒 | 地理IP | libmaxminddb | 开放式SSL |
注意:您可能需要安装gcc
、 autoconf
、 gettext
、 autopoint
等构建工具来从源代码编译/构建软件。例如, base-devel
、 build-essential
、 "Development Tools"
。
Docker 映像已更新,能够引导访问日志的输出。如果您只想输出报告,可以将日志从外部环境通过管道传输到基于 Docker 的进程:
touch report.html
cat access.log | docker run --rm -i -v ./report.html:/report.html -e LANG=$LANG allinurl/goaccess -a -o report.html --log-format COMBINED -
或实时
tail -F access.log | docker run -p 7890:7890 --rm -i -e LANG=$LANG allinurl/goaccess -a -o report.html --log-format COMBINED --real-time-html -
您还可以在隔离的容器环境中为基于 Debian 的系统构建二进制文件,以防止开发库弄乱您的本地系统:
$ curl -L "https://github.com/allinurl/goaccess/archive/refs/heads/master.tar.gz" | tar -xz && cd goaccess-master
$ docker build -t goaccess/build.debian-12 -f Dockerfile.debian-12 .
$ docker run -i --rm -v $PWD:/goaccess goaccess/build.debian-12 > goaccess
您可以在 DOCKER.md 中阅读有关使用 docker 镜像的更多信息。
内存存储提供了更好的性能,但代价是将数据集大小限制为可用物理内存量。 GoAccess 使用内存中的哈希表。它具有非常好的内存使用率和相当好的性能。该存储还支持磁盘持久性。
查看可以提供给命令或在配置文件中指定的选项。如果在配置文件中指定,则需要使用长选项,而不需要在前面添加--
。
注意:将数据通过管道传输到 GoAccess 不会提示日志/日期/时间配置对话框,您需要事先在配置文件或命令行中定义它。
要输出到终端并生成交互式报告:
# goaccess access.log
要生成 HTML 报告:
# goaccess access.log -a > report.html
要生成 JSON 报告文件:
# goaccess access.log -a -d -o report.json
要生成 CSV 报告到标准输出:
# goaccess access.log --no-csv-summary -o csv
GoAccess 还为实时过滤和解析提供了极大的灵活性。例如,通过监控 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 -i --line-buffered 'firefox' | goaccess -o report.html --real-time-html -
使用 GoAccess 解析多个日志的方法有多种。最简单的是将多个日志文件传递到命令行:
# goaccess access.log access.log.1
甚至可以在读取常规文件时从管道解析文件:
# cat access.log.2 | goaccess access.log access.log.1 -
注意:单个破折号附加到命令行,让 GoAccess 知道它应该从管道读取。
现在,如果我们想为 GoAccess 添加更多灵活性,我们可以使用zcat --force
来读取压缩和未压缩文件。例如,如果我们想处理所有日志文件access.log*
,我们可以这样做:
# zcat --force access.log* | goaccess -
注意:在 Mac OS X 上,使用gunzip -c
而不是zcat
。
使用--jobs=
(或-j
)启用多线程解析。例如:
# goaccess access.log -o report.html -j 4
并使用--chunk-size=<256-32768>
调整块大小,默认块大小为 1024。例如:
# goaccess access.log -o report.html -j 4 --chunk-size=8192
GoAccess有能力在HTML报告中输出实时数据。您甚至可以通过电子邮件发送 HTML 文件,因为它由单个文件组成,没有外部文件依赖项,这真是太简洁了!
生成实时 HTML 报告的过程与创建静态报告的过程非常相似。只需要--real-time-html
即可使其实时。
# goaccess access.log -o /usr/share/nginx/html/your_site/report.html --real-time-html
要查看报告,您可以导航至http://your_site/report.html
。
默认情况下,GoAccess 将使用生成的报告的主机名。或者,您可以指定客户端浏览器将连接到的 URL。有关更详细的示例,请参阅常见问题解答。
# goaccess access.log -o report.html --real-time-html --ws-url=goaccess.io
默认情况下,GoAccess 侦听端口 7890,要使用 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
注意:要通过 TLS/SSL 连接输出实时数据,您需要使用--ssl-cert=
和--ssl-key=
。
另一个有用的管道是从网络日志中过滤日期
以下将获取从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 -
如果我们只想解析从 DATE a 到 DATE b 的某个时间范围,我们可以这样做:
# sed -n '/5/Nov/2010/,/5/Dec/2010/ p' access.log | goaccess -a -
如果我们只想保留一定数量的数据并回收存储,我们可以只保留一定的天数。例如保留并显示最近 5 天:
# goaccess access.log --keep-last=5
假设您的日志包含虚拟主机字段。例如:
vhost.io:80 8.8.4.4 - - [02/Mar/2016:08:14:04 -0600] "GET /shop HTTP/1.1" 200 615 "-" "Googlebot-Image/1.0"
并且您希望将虚拟主机附加到请求中,以便查看顶级 url 属于哪个虚拟主机:
awk '$8=$1$8' access.log | goaccess -a -
要做同样的事情,还要使用实时过滤和解析:
tail -f access.log | unbuffer -p awk '$8=$1$8' | 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 -
或者多个状态代码,例如全部 3xx 和 5xx:
# tail -f -n +0 access.log | awk '$9~/3[0-9]{2}|5[0-9]{2}/' | goaccess -o out.html -
要了解有多少机器人(爬虫)正在访问您的服务器,请执行以下操作:
# tail -F -n +0 access.log | grep -i --line-buffered 'bot' | goaccess -
另外,值得指出的是,如果我们想以较低的优先级运行 GoAccess,我们可以将其运行为:
# nice -n 19 goaccess -f access.log -a
如果您不想将其安装在服务器上,您仍然可以从本地计算机运行它!
# ssh -n root@server 'tail -f /var/log/apache2/access.log' | goaccess -
注意: SSH 需要-n
,以便 GoAccess 可以从 stdin 读取。另外,请确保使用 SSH 密钥进行身份验证,因为如果需要密码短语,它将无法工作。
我们收到了许多之前已经回答过的问题。
GoAccess 能够通过其内部存储增量处理日志并将其数据转储到磁盘。它的工作原理如下:
--persist
持久保存数据集,然后才能加载相同的数据集。--restore
。如果传递新数据(通过管道或通过日志文件),它会将其附加到原始数据集。 GoAccess 跟踪所有已处理文件的索引节点(假设文件将保留在同一分区上),此外,它还会从日志中提取数据片段以及每个文件解析的最后一行和解析的最后一行的时间戳。例如, inode:29627417|line:20012|ts:20171231235059
首先,它比较片段是否与正在解析的日志匹配,如果匹配,则假设日志没有发生巨大变化,例如,没有被截断。如果 inode 与当前文件不匹配,则会解析所有行。如果当前文件与 inode 匹配,则会读取剩余行并更新已解析的行数和时间戳。作为一项额外的预防措施,它不会解析时间戳≤存储时间戳的日志行。
管道数据的工作原理基于最后一行读取的时间戳。例如,它将解析并丢弃所有传入条目,直到找到时间戳 >= 大于存储的时间戳。
// last month access log
# goaccess access.log.1 --persist
然后,加载它
// append this month access log, and preserve new data
# goaccess access.log --restore --persist
仅读取持久数据(不解析新数据)
# goaccess --restore
欢迎任何有关 GoAccess 的帮助。最有帮助的方法是尝试并提供反馈。请随意使用 GitHub 问题跟踪器和拉取请求来讨论和提交代码更改。
您可以通过直接在 GitHub 上编辑 .po 文件或使用 inlang.com 的可视化界面来为我们的翻译做出贡献
享受!