接上篇使用 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:$:%
") # 接收 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 |
参见这里