Kivi

没有什么远大理想,只是永远都不会满足而已


  • 首页

  • 关于

  • 标签

  • 归档

goaccess初探

发表于 2016-05-03 更新于 2017-07-02 分类于 运维 阅读次数:
本文字数: 4.9k 阅读时长 ≈ 4 分钟

需求

1.0

  • 分析nginx日志,统计经过给出的过滤条件过滤后的接口的接口信息,访问量,平均响应时间
  • 过滤条件依次为: 时间(time), 请求来源(src), 设备(device), 请求去向(dist), 资源(resourse)

2.0

  • 将给统计服务添加轮询机制,定时统计并发送邮件给管理员
  • 统计数据周期性持久化,支持复杂统计,如用户存活情况统计

解决方案

  • 分析nginx日志,打通根据各个过滤项统计出结果的过程
  • 启node server,把分析命令打包成服务
  • 添加轮询机制和与轮询机制相关的服务(如发送邮件)
  • 数据持久化

工具

  1. goaccess(0.9.8) nginx日志分析利器,0.9.8用起来非常方便

    goaccess

  2. 常用的linux命令zcat(解析.gz日志包文件), awk(gawk)(文件逐行切片读取,日志分析必用,类似的还有sed), shell正则表达式, logrotate(系统日志切割工具,超赞)

  3. nodejs(4.4.3, 毕竟LTS,6可以用来玩刺激) +koa2 + babel + gulp 打包命令行服务

  4. docker(1.7, 开工比较早导致版本较低,傻瓜式部署方案还暂时用不上1.9新特性,以后考虑更新) 部署

  5. 环境补充说明

    * 服务器 ubuntu:14.04
    * nginx 1.4.6
    

实施

nginx日志按天切割

这里统计时间最小单位是天,所以按天切割
使用命令logrotate(系统日志切割工具),非常简单暴力

日志切割逻辑大致说明

  • 系统每天执行 /etc/cron.daily/logrotate
  • logrotate 根据 /etc/logrotate.d 下的配置文件,分割文件

配置方案

  • 文件 /etc/logrotate.d/nginx
  • 配置详情,拿走不谢
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /var/log/nginx/*.log {
    daily
    errors s_f_dragon@163.com
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    prerotate
    if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
    run-parts /etc/logrotate.d/httpd-prerotate; \
    fi \
    endscript
    postrotate
    [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
    endscript
    dateext
    dateformat -%Y%m%d
    }

更多

  • 使用logrotate分割tomcat日志
  • 日志切割

goaccess的最新版版安装

这里有非常详细的安装方案
这里有非常可能遇到的问题的解决方案

  • 我是这么安装的0.9.8,不过,在这之前一定要先安装了libncursesw5-dev libgeoip-dev这两个工具,而且要保证你的ubuntu可以make && make install, 祝你好运

    1
    2
    3
    4
    5
    6
    $ wget http://tar.goaccess.io/goaccess-0.9.8.tar.gz
    $ tar -xzvf goaccess-0.9.8.tar.gz
    $ cd goaccess-0.9.8/
    $ ./configure --enable-geoip --enable-utf8
    $ make
    # make install
  • 安装完成之后, goaccess –version 应该可以打印0.9.8


命令读取并分析日志

  • goaccess 官网上有几个很有用的例子,点这里
  • zcat 读取.gz文件, 看这里
  • gawk 逐行读取文件并且根据空格切片,依次放入$1 $2..等环境变量中,awk命令不支持类似{3,}的匹配操作,所以我选择了gawk,这里浪费了不少时间,看这里
  • 举个例子
    1
    2
    3
    4
    5
    6
    7
    8
    zcat -f /var/log/nginx/*.gz | \
    gawk '{gsub(/\/m\/\w{6}/, "/m/{token}", $7); print;}' | \
    goaccess -a -M -q \
    --ignore-panel=VISITORS --ignore-panel=REQUESTS_STATIC --ignore-panel=NOT_FOUND \
    --ignore-panel=HOSTS --ignore-panel=OS --ignore-panel=BROWSERS \
    --ignore-panel=VISIT_TIMES --ignore-panel=VIRTUAL_HOSTS --ignore-panel=REFERRERS \
    --ignore-panel=REFERRING_SITES --ignore-panel=KEYPHRASES --ignore-panel=GEO_LOCATION --ignore-panel=STATUS_CODES \
    -p ~/.goaccessrc > report.html

例子说明:很简单,分为三个部分

  • zcat 读取文件
  • gawk 逐行切片,并对第7个字段做一些简单的修改
  • goaccess 将分析结果输出到report.html中,参数比较多

补充说明

shell编程中的正则表达式有好几种类型,具体可以参考这篇文章,这里不做重点讨论,如果不是无意中看到了gawk命令,然后抱着试一试的态度用了一下,还不知道要在这个坑上停留多久

这里的工作其实比较多,也比较重要拼接shell正则表达式是过滤条件的关键,我们需要做的就是将过滤条件转化为正则表达式,添加到日志分析结果声称的过程中。因为分析的是公司产品服务日志,不方便公开全部内容,这里就写到这这吧


打包命令行服务

装了个逼,其实这就是写个node server,将上个步骤准备好的正则表达式和server路由关联起来,变成接口,方便客户端调用

node环境准备:

node4.4.3 + babel + gulp,自己写了个koa-starter,感兴趣的话点这里,暂时还没有readme说明文档,稍后一定补上,已经有的功能

  • 编译环境搭建
  • 基本的中间件,路由,日志工具等,自我感觉动态路由还能值得一提
  • redis,mongodb数据库的简单使用
    还在努力完善中

定时任务和邮件发送

  • nodemailer 邮件发送
  • later 定时任务

部署

这里是另外一个浪费了点时间的地方
上面所用到的工具中,node官方docker镜像里没有的,包括goaccess, gawk,所以这两个命令需要自己添加进去,Dockerfile如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
FROM buildpack-deps:wheezy

# MAINTAINER
MAINTAINER Kivi

# Install Node
# gpg keys listed at https://github.com/nodejs/node
RUN set -ex \
&& for key in \
9554F04D7259F04124DE6B476D5A82AC7E37093B \
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \
FD3A5288F042B6850C66B31F09FE44734EB7990E \
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
B9AE9905FFD7803F25714661B63B535A4C206CA9 \
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
; do \
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
done

ENV NPM_CONFIG_LOGLEVEL info
ENV NODE_VERSION 4.4.3

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
&& grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt

# Install Goaccess
RUN apt-get update \
&& apt-get install -y wget git autoconf build-essential libgeoip-dev libncursesw5-dev pkg-config libglib2.0 \
&& git clone https://github.com/allinurl/goaccess.git \
&& cd goaccess && autoreconf -fiv && ./configure --enable-geoip --enable-utf8 \
&& make && make install \
&& apt-get purge -y wget git autoconf build-essential libncursesw5-dev pkg-config \
&& apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* && cd .. && rm -rf goaccess

# install gawk
RUN apt-get update && apt-get -y install gawk

CMD [ "node" ]

当然,你也可以直接使用docker pull kivi/node-goaccess,这是我自己打包的镜像,欢迎使用

至此,需求1.0暂时完成

##写在后面
如果你觉得我写的不错,欢迎关注我的微信公众号


微信公众号
# 运维 # nginx
Cocoapods踩坑总结
iOS圆角
  • 文章目录
  • 站点概览
kivi

kivi

nodejs | server
58 日志
17 分类
32 标签
RSS
  1. 1. 需求
  2. 2. 解决方案
  3. 3. 工具
  4. 4. 实施
    1. 4.1. nginx日志按天切割
    2. 4.2. goaccess的最新版版安装
    3. 4.3. 命令读取并分析日志
    4. 4.4. 打包命令行服务
    5. 4.5. 部署
© 2019 kivi | 173k | 2:37
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Pisces v7.3.0
|