使用goaccess对Nginx日志简单分析

上篇使用 Linux命 令来分析。使用命令太麻烦,既不快捷又不直观,市面上有不少现成的工具可以使用,比如 ELK。但 ELK 太重了,这里使用的是比较轻量的 goaccess

接收日志

goaccess 是直接对日志文件进行分析,首先要获得日志文件。nginx 原生支持将日志发送到远程 syslog , 参见官方文档

1
access_log syslog:server=xxx.xxx.xxx.xxx:514,facility=local5,tag=access_log_huanbao,severity=info main;

对于接收端,配置 rsyslog 接收数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
 
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
 
# 定义两个模板,一个生成是动态文件,一个替换默认的日志格式
template (name="nginx_access_file" type="string" string="/opt/nginx-logs/%programname%.log")
template (name="nginx_access_format" type="string"
string="%msg:2:$:%\n")
 
# 接收 facility 为 local5 的日志
local5.* action(type="omfile" dynafile="nginx_access_file" template="nginx_access_format")

接收端口514,UDP 和 TCP 协议都开了。

关于模板,得参考 rsyslog 官方文档,其中 %programname% 其实跟 %syslogtag% 一样,只是后者多了个: ,并不需要,所以使用 %programname%。全部可用属性参见这里。日志格式为何不直接使用 %msg% 呢,原因是它使用的某个标准开头就是有空格,我们并不需要,需要去掉,参见此文

关于 action,type 是必须的,指定输出模块,type 或 dynafile 必须其一,指定输出到静态文件或动态文件(动态优先),template 指定所用模板。

rsyslog 配置一大堆,写错又不报,可以通过这个命令来检查是否正确: rsyslogd -N1, 参见这里

分析日志

依据文档安装 goaccess :

1
2
3
4
5
6
$ tar -xzvf goaccess-1.3.tar.gz
$ cd goaccess-1.3/
$ ./configure --enable-utf8 --enable-geoip=mmdb --enable-tcb=btree
$ make
# make install

这里 –enable-geoip=mmdb , 是使用 geoip 的城市数据库(通过 IP 获得城市),缺少什么搜索都能解决,注意别忘了 libmaxminddb-devel.x86_64 。由于enable-tcb=btree(开多个指定数据位置需要),还需要yum install tokyocabinet-devel bzip2-devel zlib-devel。

在开始之前先要进行必要的配置,配置文件是:goaccess.conf,不知道在哪里全局搜索一下,比如我的位于:/usr/local/etc/goaccess/goaccess.conf 。必须配置的字段是time_format、date_format、log_format,在 faq 页面有说明有网友提供了一个工具 nginx2goaccess,输入日志格式是得出配置信息:

1
2
3
4
5
6
7
[root@VM_0_9_centos ~]# ./nginx2goaccess.sh '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $request_time $upstream_response_time'
 
- Generated goaccess config:
 
time-format %T
date-format %d/%b/%Y
log_format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" "%^" %T %^

然后在配置文件末尾添加这三项即可。由于还要使用 geoip 数据库,最终添加了四项:

1
2
3
4
time-format %T
date-format %d/%b/%Y
log_format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" "%^" %T %^
geoip-database /usr/local/src/GeoLite2-City_20190326/GeoLite2-City.mmdb

最后,执行以下命令,即可生成报告:

1
goaccess /opt/nginx-logs/access_log_huiyouduo.log --config-file=/usr/local/etc/goaccess/goaccess.conf -o report.html --real-time-html --daemonize

其中 -o 是生成的文件所在目录,放到一个可通过 web 访问下目录即可。最终结果:

PS,如果有多个网站,就起多个 goaccess 进程,直接写完整的命令即可(注意使用不同的 socket 端口、fifo-in、fifo-out、pid-file):

1
2
3
4
5
6
7
8
9
10
11
12
13
goaccess /opt/nginx-logs/access_log_huanbao.log \
-o /usr/share/nginx/html/laravel/public/huanbao.html \
--time-format '%T' \
--date-format '%d/%b/%Y' \
--log-format '%h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" "%^" %T %^ "%^"' \
--geoip-database /usr/local/src/GeoLite2-City_20190326/GeoLite2-City.mmdb \
--db-path /tmp/goaccess/huanbao \
--fifo-in /tmp/goaccess/huanbao/fifo.in \
--fifo-out /tmp/goaccess/huanbao/fifo.out \
--pid-file /tmp/goaccess/huanbao/goaccess.pid \
--real-time-html \
--port 7891 \
--daemonize

参见这里

posted @ 2020-06-14 14:23  Oops!#  阅读(586)  评论(0编辑  收藏  举报