轻量级日志分析工具GoAccess
使用场景
对于想在短时间内快速的生成小站点访问情况的统计数据,一般会选择使用sed、awk、grep三剑客,但是对于要对数据的展示就需要填充到已有开发面板中,比较耗时费力,当然对于也可以使用ELK/EFK专业日志分析平台来做,但搭建缓慢,服务笨重,不是小站点的首选,这里介绍一个使用C语言研发的轻量级日志分析工具GoAccess[1],性能稳定,可作为小站点日志分析统计的首选。
基础功能
GoAccess不仅图文并茂,而且速度快,每秒8W 的日志记录解析速度,websocket10秒刷新统计数据。
GoAccess随着不断地版本迭代,其支持的功能也越来与丰富、越来越能满足基本的需求,下面列举几个基础功能
- 可以实时分析几乎所有的web日志格式,并且还支持自定义日志格式
- 满足日常需要关注的基础指标
- 安装和部署简单,只需要依赖一个ncurses库
- 可以在命令行终端试试显示统计报告,也可以输出到静态html页面展示分析统计数据报告。
- 支持扩展的模块...
实践说明
安装goaccess仅有需要依赖的ncurses库
# ubuntu
apt -y install libncursesw5-dev
# centos
yum -y install ncurses-devel
当需要把Nginx访问日志中的geoip给统计导入到新的文件中时,需要GeoIP库的支持
$ wget https://github.com/maxmind/geoip-api-c/releases/download/v1.6.12/GeoIP-1.6.12.tar.gz
$ tar -xzvf GeoIP-1.6.12.tar.gz
$ cd GeoIP-1.6.12
$ ./configure
$ make
$ make install
完成Goaccess依赖的环境之后,开始构建goacess工具
wget http://tar.goaccess.io/goaccess-1.2.tar.gz
tar xf goaccess-1.2.tar.gz
cd goaccess-1.2/
./configure \
--enable-geoip \
--enable-utf8 \
--enable-geoip=legacy \
--with-openssl=/usr/bin/openssl
make && make install
我们使用Nginx的日志为例,通过解析nginx访问日志进行数据的展示,为了能准确的获取数据,下面提供一下测试时使用的nginx日志格式,log_format配置在nginx.conf的http配置段中:
# 配置nginx访问日志格式
[root@centos8 nginx]#cat /apps/nginx/conf/nginx.conf
user nginx;
worker_processes auto;
error_log /apps/nginx/logs/error.log;
pid /apps/nginx/run/nginx.pid;
events {
worker_connections 65535;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
log_format pc '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
log_format mobile '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
access_log /apps/nginx/logs/access.log main;
include /apps/nginx/conf.d/*.conf;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80 default_server;
listen [::]:80 default_server;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
[root@centos8 nginx]#
下面配置安装好GoAccess之后的配置文件:
[root@centos8 ~]#grep -Ev "^#" /usr/local/etc/goaccess.conf
time-format %T
date-format %d/%b/%Y
log_format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" "%^" %^ %^ %^ %T
...
# 上面的三行添加到配置文件中,其余的位置不需要改动
下面对部分的日志格式选项进行说明,更多的选项的使用可以直接参考官方文章自定义日志格式部分[3]
header 1 | header 2 |
---|---|
%t | 匹配time-format格式的时间字段 |
%d | 匹配date-format格式的日期字段 |
%h | host(客户端ip地址,包括ipv4和ipv6) |
%r | 来自客户端的请求行 |
%m | 请求的方法 |
%U | URL路径 |
%H | 请求协议 |
%s | 服务器响应的状态码 |
%b | 服务器返回的内容大小 |
%R | HTTP请求头的referer字段 |
%u | 用户代理的HTTP请求报头 |
%D | 请求所花费的时间,单位微秒 |
%T | 请求所花费的时间,单位秒 |
%^ | 忽略这一字段 |
在配置好之后,我们启动一个使用该nginx日志格式的服务,配置文件如下:
[root@centos8 conf.d]#cat /apps/nginx/conf.d/pc.conf
server {
listen 80;
server_name www.test.com;
access_log logs/www.test.com.log pc;
location /pc {
root /data/nginx;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_pass http://172.18.8.108;
}
}
[root@centos8 conf.d]#cat /apps/nginx/conf.d/mobile.conf
server {
listen 80;
server_name m.test.com;
access_log logs/m.test.com.log mobile;
location /mobile {
root /data/nginx;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_pass http://172.18.8.200;
}
}
[root@centos8 conf.d]#
通过命令行进行访问该服务,并且启动GoAccess的命令行控制台模式
[root@centos8 conf.d]#curl http://www.test.com/pc/
<h1> welcome to beijing</h1>
[root@centos8 conf.d]#goaccess -a -d -f /apps/nginx/logs/www.test.com.log -p /usr/local/etc/goaccess.conf
goaccess分析的文件输出到日志目录下,通过服务直接访问
goaccess -a -d \
-f /apps/nginx/logs/www.test.com.log \
-p /usr/local/etc/goaccess.conf \
-o /data/nginx/pc/log_report.html
goaccess -a -d \
-f /apps/nginx/logs/www.test.com.log \
-p /usr/local/etc/goaccess.conf \
-o /data/nginx/pc/log_report.html \
--real-time-html --daemonize
# 也可以通过以上命令实时分析日志文件,渲染到html页面
检查是否存在进程
[root@centos8 mobile]#ps -ef|grep goaccess|grep -v grep
root 12626 1 0 19:53 ? 00:00:00 goaccess -a -d -f /apps/nginx/logs/www.test.com.log -p /usr/local/etc/goaccess.conf -o /data/nginx/pc/log_report.html --real-time-html --daemonize
[root@centos8 mobile]#