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 | 响应大小 |
%R | Referer |
%u | User-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静态目录
工具不难,关键是用起来。每次出问题先看报告,比盲目翻日志效率高太多了。
有问题评论区交流,互相学习 👋