goaccess —— 实时分析 Web 访问日志

运维工具手册 09-日志与监控 5.2 KB 原文

goaccess —— 实时分析 Web 访问日志

分类:09 日志与监控 适用:Linux / macOS(goaccess 1.5 ~ 1.9),支持 Nginx / Apache / Caddy / 自定义格式 一句话:不用搭 ELK,一条命令把访问日志变成 QPS、TOP URL、状态码分布的仪表盘。

1. 它解决什么问题

  • 现在 QPS 多少?有没有异常流量?
  • 哪个 URL 被刷得最多、哪个 IP 在扫。
  • 4xx/5xx 占比、响应时间分布、静态资源缓存命中。
  • 想给业务方一个可视化报告,但不想部署整套日志平台。

2. 安装

apt install -y goaccess
dnf install -y goaccess
apk add goaccess
brew install goaccess

3. 三种使用方式

3.1 终端面板(最快的临时排查)

goaccess /var/log/nginx/access.log -c

-c 打开配置对话框,首次会让你确认日志格式(Nginx 一般选 NCSA Combined Log Format)。

3.2 生成 HTML 报告

goaccess /var/log/nginx/access.log \
  --log-format=COMBINED \
  -o /var/www/html/report.html

# 打开 file:// 或交给 nginx 提供访问

3.3 实时 HTML(持久化)

goaccess /var/log/nginx/access.log \
  --log-format=COMBINED \
  -o /var/www/html/report.html \
  --real-time-html \
  --ws-url=wss://logs.example.com:443/report.html \
  --daemonize

实时模式需要浏览器能连上 WebSocket,跨域名/HTTPS 要配 --ws-url 与反向代理。

4. 日志格式

内置别名:

别名 适用
COMBINED Nginx/Apache 默认 combined
COMMON 不带 referer/ua
VCOMBINED 带虚拟主机
AWSELB 负载均衡日志
CADDY Caddy JSON

自定义格式(Nginx log_format 加了字段时):

log_format main '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent" '
                '$request_time $upstream_response_time';
goaccess access.log \
  --log-format='%h %^[%d:%t %^] "%r" %s %b "%R" "%u" %T %^' \
  --date-format='%d/%b/%Y' \
  --time-format='%H:%M:%S'

格式字符串对照:

占位 含义
%h 客户端 IP
%d %t 日期 / 时间
%r 请求行
%s 状态码
%b 响应字节
%R Referer
%u User-Agent
%T 响应时间(秒)
%D 响应时间(微秒)
%^ 忽略该字段
%m %U %q 方法 / URL / 查询串

5. 常用参数

goaccess access.log --log-format=COMBINED -c
goaccess access.log -o report.html --log-format=COMBINED
goaccess access.log --real-time-html -o /var/www/html/r.html --daemonize
goaccess -p /etc/goaccess/goaccess.conf     # 用配置文件
goaccess --no-global-config                 # 忽略全局配置
cat access.log | goaccess -                  # 从 stdin
tail -f access.log | goaccess - --real-time-html -o out.html
goaccess access.log --ignore-crawlers        # 排除爬虫
goaccess access.log --anonymize-ip           # IP 脱敏(报告外发)
goaccess access.log --exclude-ip 10.0.0.0/8  # 排除内网
goaccess access.log --keep-db-files --load-from-disk   # 增量累积
goaccess access.log --geoip-database=/usr/share/GeoIP/GeoLite2-City.mmdb
goaccess --dcf                               # 列出内置格式
goaccess --help

6. 报告看什么

面板 用途
Unique visitors 去重 IP 数
Requested files TOP URL,找热点与异常路径
Requested static files 静态资源命中
404 URLs 死链、被扫路径
Hosts TOP IP,找刷量来源
User agents 客户端分布、异常 UA(扫描器)
Status codes 4xx/5xx 比例
Referrers 流量来源
Cache status 缓存命中(需日志字段)
Time distribution 按小时/日期分布
Virtual hosts 多站点分流
Remote user 认证用户
Response time 慢请求(需 %T)

7. 实战场景

7.1 临时看一眼当前流量

tail -f /var/log/nginx/access.log | goaccess - --log-format=COMBINED -c

不落地,实时统计,排查"是不是被打"最直接。

7.2 给团队一个实时大盘

# /etc/systemd/system/goaccess.service
[Unit]
Description=GoAccess realtime
After=network.target

[Service]
ExecStart=/usr/bin/goaccess /var/log/nginx/access.log \
  --log-format=COMBINED \
  -o /var/www/html/logs.html \
  --real-time-html --daemonize
Restart=always

[Install]
WantedBy=multi-user.target

nginx 里暴露:

location /logs.html {
    auth_basic "logs";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

必须加认证,访问日志里有 IP 和 URL,属敏感数据。

7.3 分析昨天的日志并归档报告

zcat /var/log/nginx/access.log-20261104.gz \
  | goaccess - --log-format=COMBINED -o /var/www/reports/20261104.html

7.4 排查被扫描

goaccess access.log --log-format=COMBINED -c
# 看 404 URLs(.env、wp-admin、phpmyadmin)与 Hosts 的请求数

高频 404 + 陌生 UA = 扫描器,配合 fail2ban 封禁。

7.5 多站点合并

zcat /var/log/nginx/*.log*.gz | goaccess - --log-format=VCOMBINED -o all.html

8. 常见坑

  1. 日志格式不匹配:报告全空或大量"无效行",先用 --dcf 对照,再写 --log-format。
  2. %T 单位:Nginx $request_time 是秒(带小数),goaccess 的 %T 按秒解析,配 --time-format 要注意。
  3. 实时模式不更新:WebSocket 连不上,检查 --ws-url、反代是否支持 Upgrade、端口是否放行。
  4. --daemonize 后无输出:进程在后台,看 ps 与日志文件。
  5. HTML 报告打不开图表:需要联网加载 CDN 资源,内网环境要 --html-prefs 或离线资源。
  6. 增量分析重复计数:默认每次从零统计,用 --keep-db-files --load-from-disk 或 --persist。
  7. 压缩日志:goaccess 支持 .gz,但管道多文件时要 zcat。
  8. IPv6 地址:部分格式需要调整正则。
  9. 内存占用:超大日志 + 高基数 IP/URL 会吃内存,加 --no-query-string 或限制面板。
  10. 隐私合规:外发报告务必 --anonymize-ip,并去掉 UA 中的敏感信息。
  11. 时区:日志时间与报告时间不一致时,用 --tz 或统一容器时区。
  12. 不替代监控告警:它是分析工具,没有告警能力。

9. 速查表

goaccess access.log -c                                  # 终端面板
goaccess access.log --log-format=COMBINED -o r.html     # HTML
goaccess access.log --real-time-html -o r.html --daemonize
tail -f access.log | goaccess - --log-format=COMBINED -c
goaccess access.log --ignore-crawlers --anonymize-ip -o r.html
goaccess access.log --exclude-ip 10.0.0.0/8
goaccess --dcf                                          # 内置格式列表
goaccess --log-format='%h %^[%d:%t %^] "%r" %s %b "%R" "%u" %T' \
         --date-format='%d/%b/%Y' --time-format='%H:%M:%S'
goaccess —— 实时分析 Web 访问日志 - 知识库 - 起航社区