用 GoAccess 分析 Nginx 的日志

GoAccess 是什么?

GoAccess 是一款开源、实时,运行在命令行终端下的 web 日志分析工具。该工具提供快速、多样的 HTTP 状态统计,可以令管理员不再纠结于统计各类数据,和繁杂的指令以及一大堆管道 / 正则表达式说 byebye。


功能一览

  • 生成统计数据,带宽统计等
  • 每个请求的时间统计
  • 最高访问 ip
  • 请求的文件统计
  • 请求的静态文件、图片、flash、js 文件等
  • 各 HTTP 状态码统计
  • Hosts,反向 DNS,IP 所在地
  • 操作系统
  • 浏览器 / 蜘蛛
  • 引用的网站
  • 引用的 URLs
  • 关键词组
  • 地理位置 (大陆、国家、城市)
  • 可输出 JSON 或 CSV
  • 各种的颜色主题
  • 支持大容量数据且支持大容量数据的持续分析
  • 支持 IPv6
  • 可生成 HTML 报告

开始使用

  • 如果想从源码编译:
1
2
3
4
5
wget http://tar.goaccess.io/goaccess-0.8.1.tar.gz
tar -xzvf goaccess-0.8.1.tar.gz
cd goaccess-0.8.1/
./configure --enable-geoip --enable-utf8
make && make install
  • 从软件包管理器安装:

Debian/Ubuntu

1
# apt-get install goaccess

CentOS/Fedora

1
yum install goaccess

OSX

1
brew install goaccess

用 Access 来分析 Nginx 日志

然后就可以开始使用 GoAccess 了。

首先,进入 nginx 的日志目录,如 /var/log/nginx,输入如下命令让 goaccess 打开指定文件:

1
goaccess -f access.log

打开之后会跳出选择日志文件类型的界面:

Nginx 日志是属于 Combined Log Format (XLF/ELF) 类型的,所以我们选择第三个。用上下光标移动,空格选中,回车确定。

进入了主界面:

键盘操作:

  • F1h:帮助
  • F5 :刷新主界面
  • q:退出程序 / 当前窗口 / 折叠当前模块
  • oEnter:展开选中的模块或窗口
  • 0-9 以及 Shift + 0:将选中的模块或窗口激活
  • kj:模块内部移动
  • c:修改配色
  • ^f^b:模块中上下滚屏
  • tab shift+tab:前后切换模块
  • s:模块内部排序选择
  • /:在所有模块中搜索 (支持正则)
  • n:找到下个匹配
  • gG:跳到第一项 / 最后一项

命令行下相关:

在使用 goaccess 命令行前,我们必须配置日志文件的解析格式,因为此处没有界面来让你选择日志格式了。

看一下日志格式:

1
2
$tail access.log
219.137.254.254 - - [12/Jul/2014:14:55:04 +0800] "GET / HTTP/1.1" 301 185 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36" "-"

如果你的日志格式和我一样,那么就不用自己折腾了。请跳过下一小段。

如果你的日志格式和我不同,那么请去 http://goaccess.io/man#custom-log 看一下格式的基本规范。以我的 log 为例:

ip - - [日期] "请求类型" 服务器响应 大小 来源 浏览器信息 "代理"

%h %^[%d:%^] "%r" %s %b "%R" "%u" %^

各项代表的意思可以去 http://goaccess.io/man#custom-log 查看。

现在配置一下:

1
vim /etc/goaccess.conf

如果有这行:

1
2
#NCSA Combined Log Format with Virtual Host
#log-format %^:%^ %h %^[%d:%^] "%r" %s %b "%R" "%u"

那就去掉下面 log-format 前的#吧。

如果没有,就写一行。

log-format %h %^[%d:%^] "%r" %s %b "%R" "%u" %^

找到

1
2
#Any Apache log date format
#date-format %d/%b/%Y

取消掉 date-format 的注释。


使用 GoAccess 生成 html 报告:

1
# goaccess -f access.log -a > report.html

生成 json 报告:

1
goaccess -f access.log -a -d -o json > report.json

CSV:

1
goaccess -f access.log -o csv > report.csv

由于 nginx 会自动压缩日志,一下命令可以直接分析压缩后的日志:

1
2
3
zcat access.log.*.gz | goaccess
#或者
zcat -f access.log* | goaccess

支持各种管道:

1
sed -n '/11\/Dec\/2014/,$ p' access.log | goaccess -a

想分析下百度 /google 对你网站爬了些啥内容?Easy:

1
2
grep -E "(google|baidu)"access.log | goaccess -a

嗯,辛勤的谷歌今天已经来我的网站爬了 4 个页面了。:)


有哪些不足?

  1. 只支持 maxmind 的地理数据库。当然 maxmind 也有免费版本

  2. 其他的缺点实在想不到了。因为支持管道,所以一切都那么方便.

作者

薯条

发布于

2014-07-14

更新于

2024-01-15

许可协议

评论