GoAccess 是一款开源、实时的 Web 日志分析器和交互式查看器,可在 *nix 系统的终端中或直接在浏览器中运行。专为系统管理员、DevOps 工程师和安全专业人员设计,它能快速提供可操作的 HTTP 统计数据和可视化的服务器报告。GoAccess 实时解析您的 Web 服务器日志,并直接在终端或通过实时 HTML 仪表板呈现数据,使您可以轻松监控流量、检测异常并即时排查问题。
更多信息请访问:https://goaccess.io。
GoAccess 解析指定的 Web 日志文件,并将数据输出到 X 终端。功能包括:
完全实时
所有面板和指标每 200 毫秒在终端输出中更新,每 1 秒在 HTML 输出中更新。
极简配置需求
您只需直接针对访问日志文件运行它,选择日志格式,然后让 GoAccess 解析访问日志并显示统计数据。
跟踪应用响应时间
跟踪服务请求所花费的时间。如果您想跟踪拖慢网站速度的页面,这非常有用。
WebSocket 认证:
GoAccess 提供增强的 WebSocket 认证,支持本地和外部 JWT 验证,具有安全的令牌刷新能力,并与外部认证系统无缝集成。
几乎所有 Web 日志格式
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 部分。还有关于如何使用 docker-compose 的文档。
GoAccess 允许任何自定义日志格式字符串。预定义选项包括但不限于:
GoAccess 被设计为一种快速的、基于终端的日志分析器。其核心思想是无需使用浏览器即可实时快速分析和查看 Web 服务器统计数据(如果您想通过 SSH 对访问日志进行快速分析,或者您只是喜欢在终端中工作,这非常棒)。
它还可以作为安全监控的实用工具,使您能够直接从日志中发现可疑活动、异常流量模式、暴力破解尝试、扫描器、爬虫和异常请求。
虽然终端输出是默认输出,但它能够生成一个完整的、自包含的、实时的 HTML 报告,以及 JSON 和 CSV 报告。
您可以将其视为一种监控命令工具,而非其他。
GoAccess 可以在 *nix 系统上编译和使用。
下载、解压并编译 GoAccess:
$ wget https://tar.goaccess.io/goaccess-1.10.2.tar.gz
$ tar -xzvf goaccess-1.10.2.tar.gz
$ cd goaccess-1.10.2/
$ ./configure --enable-utf8 --enable-geoip=mmdb --with-zlib
$ 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 上,使用您发行版的首选包管理器安装 GoAccess 是最简单的。请注意,并非所有发行版都提供最新版本的 GoAccess。
# apt-get install 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 子系统。
已更新 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 -
还有关于如何使用 docker-compose 的文档。
您还可以在隔离的容器环境中为基于 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 依赖极少,使用 C 语言编写,仅需 ncurses。然而,以下表格列出了一些可选依赖项,这些依赖项在某些发行版中用于从源代码构建 GoAccess。
注意: 您可能需要安装诸如 gcc、autoconf、gettext、autopoint 等构建工具,以便从源代码编译/构建软件。例如,base-devel、build-essential、"Development Tools"。
内存存储提供了更好的性能,但代价是将数据集大小限制为可用物理内存量。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=<count>(或 -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。请参阅 FAQ 获取更详细的示例。
# 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=<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 -
如果我们只想解析从 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 -
要解析特定页面,例如,请求中的 page views、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 - --log-format=COMBINED
注意: SSH 需要 -n 以便 GoAccess 可以从标准输入读取。另外,确保使用 SSH 密钥进行身份验证,因为如果需要密码短语,它将无法工作。
我们收到许多之前已经回答过的问题和问题。
GoAccess 能够通过其内部存储并转储数据到磁盘来增量处理日志。其工作方式如下:
--persist 持久化数据集,然后可以使用以下方式加载相同的数据集。--restore。如果传递了新的数据(通过管道或日志文件),它将追加到原始数据集中。GoAccess 跟踪所有已处理文件的 inode(假设文件将保留在同一分区上),此外,它还从日志中提取一个数据片段,以及每个文件解析的最后一行和最后一行的的时间戳。例如,inode:29627417|line:20012|ts:20171231235059
首先,它比较片段是否与正在解析的日志匹配,如果匹配,则假设日志没有发生重大变化,例如没有被截断。如果 inode 与当前文件不匹配,则解析所有行。如果当前文件匹配 inode,则读取剩余行并更新已解析行数和时间戳计数。作为额外的预防措施,它不会解析时间戳 ≤ 已存储时间戳的日志行。
管道传输的数据基于最后读取行的的时间戳工作。例如,它将解析并丢弃所有传入的条目,直到找到时间戳 >= 已存储时间戳的条目。
// 上个月的访问日志
# goaccess access.log.1 --persist
然后,使用以下方式加载
// 追加本月的访问日志,并保留新数据
# goaccess access.log --restore --persist
仅读取持久化数据(不解析新数据)
# goaccess --restore
您可以通过直接在 GitHub 上编辑 .po 文件或使用可视化界面 inlang.com 来贡献翻译。
尽情使用吧!
| 发行版 | NCurses | GeoIP (可选) | GeoIP2 (可选) | OpenSSL (可选) |
|---|
| Ubuntu/Debian | libncurses-dev | libgeoip-dev | libmaxminddb-dev | libssl-dev |
| RHEL/CentOS | ncurses-devel | geoip-devel | libmaxminddb-devel | openssl-devel |
| Arch | ncurses | geoip | libmaxminddb | openssl |
| Gentoo | sys-libs/ncurses | dev-libs/geoip | dev-libs/libmaxminddb | dev-libs/openssl |
| Slackware | ncurses | GeoIP | libmaxminddb | openssl |