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