Goaccess-Nginx日志分析-5分钟生成实时可视化报告

3 阅读3分钟

Goaccess + Nginx日志:5分钟生成一个实时可视化报告

为什么需要看日志

我维护的服务器上跑了几个Web服务,平时没事还好,一有问题第一反应就是去看Nginx日志。

但直接tail -f access.log看那玩意儿…眼睛都要看花。尤其是想看"哪个接口响应慢"、"有没有异常IP在刷"、"流量高峰是什么时候",纯看日志根本看不出来。

后来发现了Goaccess,一个终端里直接跑的工具,能生成漂亮的HTML报告,还支持实时刷新。配置好之后,排查问题的效率提升了好几个档次。

Goaccess是什么

一句话:Nginx日志的实时可视化分析工具

  • 终端直接跑,也支持生成HTML文件在浏览器看
  • 实时刷新,不用手动操作
  • 零依赖,一个二进制文件搞定
  • 开源免费

安装

# macOS
brew install goaccess

# CentOS/RHEL
yum install goaccess

# Ubuntu/Debian
apt install goaccess

最快上手:一条命令

如果你的Nginx用的是默认的COMBINED日志格式,直接这样:

goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED --real-time-html

打开report.html,你就有一个完整的访问分析报告了。包含:

  • 访问量趋势
  • 独立访客数
  • 请求的URL排名
  • 静态资源排名(JS/CSS/图片)
  • 404等状态码统计
  • 操作系统/浏览器分布
  • 来源IP排行
  • HTTP响应时间排名(这个排查慢接口很有用)

--real-time-html 加上之后,报告会自动刷新,适合挂在监控屏上。

自定义日志格式

我的Nginx日志不是标准格式,这种情况需要手动指定格式。

先看一下你的Nginx日志长什么样:

tail -5 /var/log/nginx/access.log

输出类似这样:

192.168.1.50 - - [13/Apr/2026:10:30:15 +0800] "GET /api/tasks HTTP/1.1" 200 1234 "http://example.com" "Mozilla/5.0"

如果是标准COMBINED格式,直接用上面的命令就行。

如果是自定义格式,比如带有协议头的:

goaccess access.log \
  -o /usr/local/nginx/html/report.html \
  --log-format='~h{, } %^[%d:%t %^] "%r" %s %b "%R" "%u"' \
  --date-format=%d/%b/%Y \
  --time-format=%T

这里解释一下格式参数:

参数含义
%h客户端IP
%d:%t日期和时间
%r请求行(GET /path HTTP/1.1)
%s状态码
%b响应大小
%RReferer
%uUser-Agent
~h{, }匹配可选的协议头(如192.168.1.1,
%^忽略某个字段

实用技巧

1. 只看最近一小时的日志

goaccess access.log --log-format=COMBINED --date-format=%d/%b/%Y --time-format=%T

在HTML报告里可以直接用时间筛选器过滤。

2. 排查慢接口

报告里的"Requested URL"表格会显示每个URL的平均响应时间。按响应时间排序,一眼就能看到哪些接口慢。

如果Nginx日志里没有响应时间,需要在nginx.conf的log_format里加上$request_time

log_format main '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent" '
                '$request_time';

# $request_time 是请求处理时间,单位秒

改完之后nginx -s reload,Goaccess格式里加上%T

goaccess access.log \
  -o report.html \
  --log-format='... "%r" %s %b "%R" "%u" %T' \
  --date-format=%d/%b/%Y \
  --time-format=%T

3. 用终端模式快速看

不需要HTML的时候,直接终端看也很舒服:

goaccess access.log --log-format=COMBINED

会有一个彩色的交互式界面,方向键切换面板,q退出。

4. 配合Docker使用

我的服务跑在Docker里,Nginx日志可以这样导出来分析:

# 导出日志
docker logs nginx-container > access.log

# 分析
goaccess access.log --log-format=COMBINED -o report.html --real-time-html

部署到服务器上(可选)

如果想让报告一直在线上可访问:

# 生成到Nginx的静态目录
goaccess /var/log/nginx/access.log \
  -o /usr/local/nginx/html/report.html \
  --real-time-html \
  --log-format=COMBINED \
  --time-format='%H:%M:%S' \
  --date-format='%d/%b/%Y'

# 配一个nginx location
location /report.html {
    root /usr/local/nginx/html;
}

--real-time-html的话,Goaccess会启动一个WebSocket服务,报告会实时更新。配合nohup或者systemd让它后台跑就行。

总结

  • 标准COMBINED格式:一条命令搞定
  • 自定义格式:对照日志写log-format
  • 想排查慢接口:确保日志里有$request_time
  • 想长期监控:生成HTML放到Nginx静态目录

工具不难,关键是用起来。每次出问题先看报告,比盲目翻日志效率高太多了。


有问题评论区交流,互相学习 👋