• 使用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:$:% ")
     
    # 接收 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

    参见这里

  • 相关阅读:
    JQuery中的bind()和unbind()的理解
    一行代码实现数组去重(ES6)
    vue.js学习笔记(Vuejs——组件——props数据传递)
    判断一个字符串书否存在某个字符,取出一段字符串括号中的内容
    在vue中使用高德地图vue-amap
    在egg.js中使用mongodb
    使用Element的upload上传组件,不使用action属性上传
    下载和安装mongodb4.2.0+robmongo可视化工具
    数组对象根据某个属性取出重复的个数
    钉钉小程序----使用阿里的F2图表
  • 原文地址:https://www.cnblogs.com/weifeng1463/p/13124702.html
Copyright © 2020-2023  润新知