轻量级日志分析工具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]#

posted @ 2021-04-08 20:03  临江仙我亦是行人  阅读(443)  评论(0编辑  收藏  举报