GoAccess 是一款开源、实时,运行在命令行终端下的 Web 日志分析工具。
该工具提供快速、多样的 HTTP 状态统计。
分析结果,可以通过 XShell 等客户端工具查看,并且可以生成 Html 报告。
GitHub 地址:https://github.com/allinurl/goaccess
官网地址:http://goaccess.io/
centos6.x
系统已经安装了LNMP
安装:
# yum -y install glib2 glib2-devel ncurses ncurses-devel GeoIP GeoIP-devel # wget http://tar.goaccess.io/goaccess-1.2.tar.gz # tar -xzvf goaccess-1.2.tar.gz # cd goaccess-1.2/ # ./configure --enable-geoip --enable-utf8 # make && make install
默认配置文件在
# vi /usr/local/etc/goaccess.conf
根据你的日志格式,配置以下参数,这里只需要将 # 去掉即可。
time-format
date-format
log-format
接下来我们测试一下。现在就需要根据Nginx的日志格式来写goaccess的规则
# goaccess -f /usr/local/nginx/logs/access.log -a > /root/test/report.html
第二步:自定义配置
%x 匹配替代time_format和date_format的设定,可以同时调用两个的全局设置
%t 匹配替代time_fromat的设置
%d 匹配替代 date_format的设置
%h 客户端ip $remote_addr
%r 请求方法 $request
%m 请求算法 相当于$request中的 post或get的匹配
%U 请求的URL路径(包括任何查询字符串) 相当于$request中的 URL匹配
%H 请求的协议 相当于$request中的 HTTP/1.1
%s 服务端返回客户端的状态code $status
%b 返回客户端的body size
$body_bytes_sent
%R refer $http_referer
%u user-agent $http_user_agent
%D 服务请求的时间,以微秒为单位 $request_time
%T 服务请求的时间,以秒为单位 $request_time
%L 服务请求的时间,以毫秒为单位 $request_time
%^ 忽略官方没有对应参数的区域
以上是官方给出的所有匹配参数,原版见
http://www.goaccess.io/man
网络上大部分的文章和介绍都只适合没任何修改的nginx日志格式,对自定义的log format都不怎么涉及。如果你采用的自定义的nginx日志格式,那么此处就需要特别注意,一旦log-format配置不对,goaccess分析的结果会差很大。
以我nginx日志格式为例:
log_format mAIn '$server_name $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $upstream_addr $request_time $upstream_response_time;
按照goaccess预设的log format,这样的日志是没法分析的,所以我们需要自定义log format。
我的log format为:
log-format %^ %h %^ %^ [%d:%t %^] “%r” %s %b “%R” “%u” “%^” %^ %T %^
为了设置正确的log format,踩了不少坑,先列出来避免大家重复碰到。
(1) log format默认是按照空格分隔日志信息的,所以,对于包含了特殊字符如空格等信息的字段,必须包含在“”里面。如字段request http_user_agent等
(2) nginx日志格式里面,采用空格分隔,但是此处一定注意,只能用一个空格。当时我有个地方用了两个空格,直接导致goaccess结果出错。
(3) nginx日志中的每一个字段都要和log format中的一一对应,如果log format中不需要nginx中的某一个信息,则用%^跳过该信息。
(4) 对于nginx日志中的每一个 - log format都需要一个%^来跳过, 如果是“-”, 则用“%^”
(5) 如果nginx日志信息中有:, 则需要在log format中也显示出来。例如nginx日志中$time_local就包含了:,所以在log format的相应位置也是 [%d:%t %^]
希望这些能帮助使用goaccess的朋友。
参考: