需求
1.0
- 分析nginx日志,统计经过给出的过滤条件过滤后的接口的
接口信息
,访问量
,平均响应时间
- 过滤条件依次为:
时间(time)
,请求来源(src)
,设备(device)
,请求去向(dist)
,资源(resourse)
2.0
- 将给统计服务添加轮询机制,定时统计并发送邮件给管理员
- 统计数据周期性持久化,支持复杂统计,如用户存活情况统计
解决方案
- 分析nginx日志,打通根据各个过滤项统计出结果的过程
- 启
node server
,把分析命令打包成服务 - 添加轮询机制和与轮询机制相关的服务(如发送邮件)
- 数据持久化
工具
goaccess(0.9.8) nginx日志分析利器,0.9.8用起来非常方便
常用的linux命令
zcat(解析.gz日志包文件)
,awk(gawk)(文件逐行切片读取,日志分析必用,类似的还有sed)
,shell正则表达式
,logrotate(系统日志切割工具,超赞)
nodejs(4.4.3, 毕竟LTS,6可以用来玩刺激) +
koa2
+babel
+gulp
打包命令行服务docker(1.7, 开工比较早导致版本较低,傻瓜式部署方案还暂时用不上1.9新特性,以后考虑更新) 部署
环境补充说明
* 服务器 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
}
更多
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
8zcat -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
44FROM 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暂时完成
##写在后面
如果你觉得我写的不错,欢迎关注我的微信公众号
