allinurl/goaccess

GitHub: allinurl/goaccess

一款用 C 语言编写的轻量级实时 Web 日志分析器,可在终端或浏览器中交互式查看 HTTP 流量统计与服务器报告。

Stars: 20507 | Forks: 1177

# GoAccess [![C 构建](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/aa70167057020324.svg)](https://github.com/allinurl/goaccess/actions/workflows/build-test.yml) [![GoAccess](https://goaccess.io/badge)](https://goaccess.io) ## 它是什么? GoAccess 是一个开源的实时 Web 日志分析器和交互式查看器,它在 *nix 系统的终端中运行,或直接在您的浏览器中运行。专为系统管理员、DevOps 工程师和安全专家设计,它能即时提供快速、可操作的 HTTP 统计数据和可视化的服务器报告。GoAccess 实时解析您的 Web 服务器日志,并在终端或通过实时 HTML 仪表板直接呈现数据,从而可以轻松监控流量、检测异常并立即排除问题。 更多信息请访问:[https://goaccess.io](https://goaccess.io/?src=gh)。 [![GoAccess 终端仪表板](https://goaccess.io/images/goaccess-real-time-term-gh-2026-1.png?2026021201)](https://goaccess.io/) [![GoAccess HTML 仪表板](https://goaccess.io/images/goaccess-real-time-html-gh-2026.png?2026021201)](https://rt.goaccess.io/?src=gh) ## 功能特性 GoAccess 解析指定的 Web 日志文件并将数据输出到 X 终端。功能包括: * **完全实时**
所有面板和指标设定为在终端输出上每 200 毫秒更新一次,在 HTML 输出上每秒更新一次。 * **最少配置需求**
您只需针对您的访问日志文件运行它,选择日志格式,然后让 GoAccess 解析访问日志并向您展示统计数据即可。 * **跟踪应用程序响应时间**
跟踪处理请求所花费的时间。如果您想跟踪导致网站变慢的页面,这非常有用。 * **WebSocket 认证:**
GoAccess 提供增强的 WebSocket 认证,支持本地和外部 JWT 验证,具有安全的 token 刷新功能,并能与外部认证系统无缝集成。 * **几乎支持所有 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](https://github.com/allinurl/goaccess#docker) 部分。 这里还有关于如何使用 [docker-compose](./docker-compose/README.md) 的文档。 ### 几乎所有的 Web 日志格式... GoAccess 允许任何自定义日志格式字符串。预定义选项包括但不限于: * Amazon CloudFront (下载分发)。 * Amazon Simple Storage Service (S3) * AWS Elastic Load Balancing * 组合日志格式 (XLF/ELF) Apache | Nginx * 通用日志格式 (CLF) Apache * Google Cloud Storage。 * Apache 虚拟主机 * Squid 原生格式。 * W3C 格式 (IIS)。 * Caddy 的 JSON 结构化格式。 * Traefik 的 CLF 风格 ## 为什么选择 GoAccess? GoAccess 旨在成为一个快速的、基于终端的日志分析器。它的核心理念是实时快速分析和查看 Web 服务器统计数据,而无需使用浏览器(如果您想通过 SSH 对访问日志进行快速分析,或者您只是喜欢在终端中工作,这将非常有用)。 它还可用作安全监控的实用工具,能够直接从日志中轻松发现可疑活动、异常流量模式、暴力破解尝试、扫描器、机器人和异常请求。 虽然终端输出是默认输出,但它能够生成完整、自包含的实时 [**`HTML`**](https://rt.goaccess.io/?src=gh) 报告,以及 [**`JSON`**](https://goaccess.io/json?src=gh) 和 [**`CSV`**](https://goaccess.io/goaccess_csv_report.csv?src=gh) 报告。 您可以更多地将其视为一个监控命令工具。 ## 安装 Packaging status ### 从发行版构建 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 ``` ### 从 GitHub 构建 (开发版) ``` $ 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。 #### Debian/Ubuntu ``` # apt-get install goaccess ``` **注意:** 这可能会安装过时的 GoAccess 版本。为确保您运行的是最新稳定版的 GoAccess,请参阅下面的替代选项。 #### 官方 GoAccess Debian & Ubuntu 仓库 ``` $ 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`。 #### Fedora ``` # yum install goaccess ``` #### Arch ``` # pacman -S goaccess ``` #### Gentoo ``` # emerge net-analyzer/goaccess ``` #### OS X / Homebrew ``` # brew install goaccess ``` #### FreeBSD ``` # cd /usr/ports/sysutils/goaccess/ && make install clean # pkg install sysutils/goaccess ``` #### OpenBSD ``` # cd /usr/ports/www/goaccess && make install clean # pkg_add goaccess ``` #### openSUSE ``` # zypper ar -f obs://server:http http # zypper in goaccess ``` #### OpenIndiana ``` # pkg install goaccess ``` #### pkgsrc (NetBSD, Solaris, SmartOS, ...) ``` # pkgin install goaccess ``` #### Windows GoAccess 可以通过 Cygwin 在 Windows 上使用。请参阅 Cygwin 的 软件包。或者通过 Windows 10 上的 GNU+Linux 子系统使用。 #### Docker 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](./docker-compose/README.md) 的文档。 ##### 在隔离容器中构建 您还可以在隔离的容器环境中为基于 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](https://github.com/allinurl/goaccess/blob/master/DOCKER.md) 中阅读有关使用 docker 镜像的更多信息。 #### 发行版软件包 GoAccess 的依赖要求极少,它是用 C 语言编写的,仅需要 ncurses。但是,下面是一张表格,列出了在某些发行版中从源代码构建 GoAccess 所需的一些可选依赖项。 | 发行版 | 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 | **注意**:您可能需要安装构建工具,例如 `gcc`、`autoconf`、`gettext`、`autopoint` 等,以便从源代码编译/构建软件。例如,`base-devel`、`build-essential`、`"Development Tools"`。 ## 存储 #### 默认哈希表 内存存储提供了更好的性能,代价是将数据集大小限制为可用的物理内存量。GoAccess 使用内存哈希表。它的内存使用率非常低,性能也非常出色。这种存储同样支持磁盘持久化。 ## 命令行 / 配置选项 请参阅可以提供给命令或在配置文件中指定的 [**选项**](https://goaccess.io/man#options)。如果在配置文件中指定,则长选项在使用时不需要在前面加上 `--`。 ## 使用方法 / 示例 **注意**:通过管道将数据传递给 GoAccess 不会弹出日志/日期/时间配置对话框,您需要事先在配置文件或命令行中对其进行定义。 ### 入门指南 输出到终端并生成交互式报告: ``` # goaccess access.log ``` 生成 HTML 报告: ``` # goaccess access.log -a > report.html ``` 生成 JSON 报告文件: ``` # goaccess access.log -a -d -o report.json ``` 将 CSV 报告输出到 stdout: ``` # goaccess access.log --no-csv-summary -o csv ``` 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 ``` ### 实时 HTML 输出 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](https://goaccess.io/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=` 和 `--ssl-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 - ``` 如果我们只想解析从日期 A 到日期 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 - --log-format=COMBINED ``` **注意:** SSH 需要 `-n` 参数,以便 GoAccess 能从 stdin 读取数据。此外,请确保使用 SSH 密钥进行身份验证,因为如果需要密码短语它将无法运行。 #### 疑难解答 我们收到过许多之前已经解答过的问题和 issue。 * 日期/时间匹配问题?请检查您的日志格式和运行 GoAccess 的系统语言环境是否匹配。请参阅 [#1571](https://github.com/allinurl/goaccess/issues/1571#issuecomment-543186858) * 模式匹配问题?空格通常是一个问题,例如参见 [#136](https://github.com/allinurl/goaccess/issues/136)、[#1579](https://github.com/allinurl/goaccess/issues/1579) * 匹配日志条目的其他问题:请参阅 [>200 个已关闭的关于日志/日期/时间格式的 issue](https://github.com/allinurl/goaccess/issues?q=is%3Aissue+is%3Aclosed+label%3A%22log%2Fdate%2Ftime+format%22) * 日志处理问题?请参阅 [>111 个关于日志处理的 issue](https://github.com/allinurl/goaccess/issues?q=is%3Aissue+is%3Aclosed+label%3Alog-processing) #### 增量日志处理 GoAccess 能够通过其内部存储增量处理日志,并将其数据转储到磁盘。它的工作方式如下: 1. 必须首先使用 `--persist` 持久化一个数据集,然后才能使用以下命令加载同一个数据集。 2. `--restore`。如果传递了新数据(通过管道或通过日志文件),它将把新数据附加到原始数据集中。 ##### 注意事项 GoAccess 会跟踪所有已处理文件的 inode(假设文件将留在同一分区上),此外,它还会从日志中提取一段数据片段以及每个文件解析到的最后一行和最后一行解析的时间戳。例如,`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 issue 跟踪器和 pull requests 来讨论并提交代码更改。 您可以直接在 GitHub 上编辑 .po 文件或使用可视化界面 [inlang.com](https://inlang.com/editor/github.com/allinurl/goaccess) 来为我们的翻译做出贡献。 祝您使用愉快!
标签:Apache, Berkeley Packet Filter, HTML仪表盘, HTTP统计, JWT认证, Linux工具, Nginx, WebSocket, Web服务器, 依赖分析, 响应时间跟踪, 客户端加密, 异常检测, 报表生成, 日志解析器, 服务器性能, 流量监控, 端口探测, 系统管理员, 终端工具, 请求拦截, 运维工具