sanic+mongodb+highcharts 分析nginx流量

       

Nginx日志

按日期切割log

1
2
3
mv /var/log/nginx-server.access.log /var/log/nginx/nginx-server.access_$(date -d "yesterday" +"%Y%m%
d").log
kill -USR1 `cat /etc/nginx/logs/nginx.pid`

首先要明确自己的Nginx的日志格式,找到配置文件如下:

1
2
3
log_format  main  '$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"';

以上是我Nginx日志的格式

Nginx日志分析处理

啥也别说了 直接上代码:

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#coding=utf-8
import linecache
import re
import time,datetime
import glob
import os
import conn
w = '''112.224.65.85 - - [20/Aug/2013:00:01:02 +0800] "POST /api/topic/comments HTTP/1.1" 200 3804 "-" "Corax/0.7.0 CFNetwork/609.1.4 Darwin/13.0.0" "-" "1.173" "0.005"'''
files_dir = "/home/corax/ops/data/"
bak_dir = "/home/corax/ops/data/backup"

def readfile(path):
filename = []
files = glob.glob(path + '*.log')
return files

def readtime(path):
read_time = []
files = glob.glob(path + '*.log')
print files
for i in files:
read_time.append(i.split('_')[1].split('.')[0])
read_time = set(read_time)
return read_time

def timestamp(time_file):
return time.mktime(time.strptime(time_file,'%Y%b%d %H:%M:%S'))

def datestamp(date_name):
return time.strptime(date_name,'%Y%b%d')

def handle_log(log_file):
ip = r"?P<ip>[\d.]*"
date = r"?P<date>\d+"
month = r"?P<month>\w+"
year = r"?P<year>\d+"
log_time = r"?P<time>\S+"
method = r"?P<method>\S+"
request = r"?P<request>\S+"
status = r"?P<status>\d+"
bodyBytesSent = r"?P<bodyBytesSent>\d+"
refer = r"""?P<refer>
[^\"]*
"""

userAgent=r"""?P<userAgent>
\S*
"""

forwardr=r"""?P<forwardr>
[^\"]*
"""

request_time=r"""?P<request_time>
[^\"]*
"""

response_time=r"""?P<response_time>
[^\"]*
"""

p = re.compile(r"(%s)\ -\ -\ \[(%s)/(%s)/(%s)\:(%s)\ [\S]+\]\ \"(%s)?[\s]?(%s)?.*?\"\ (%s)\ (%s)\ \"(%s)\"\ \"(%s).*?\"\ \"(%s)\"\ \"(%s)\"\ \"(%s)\"" %(ip, date, month, year, log_time, method, request, status, bodyBytesSent, refer, userAgent, forwardr, request_time, response_time ), re.VERBOSE)

s = time.time()

log_list = []
for l in log_file:
f = open(l,'r')
file_all = f.read()
m = re.findall(p,file_all)
for g in m:
time_all = '%s%s%s %s'%(g[3], g[2], g[1], g[4])
time_format = timestamp(time_all)
date = time.strftime("%Y%m%d",datestamp('%s%s%s'%(g[3], g[2], g[1])))
hour = g[4].split(":")[0]
# print date,hour
if g[12] != "-":
req_time = float(g[12])
else:
req_time = None
if g[13] != "-" and len(g[13])<=5:
res_time = float(g[13])
else:
res_time = None
log = {'ip':g[0],'time':time_format,'method':g[5],'request':g[6],'status':g[7],'bodyBytesSent':g[8],'refer':g[9],'userAgent':g[10],'forwardr':g[11],'request_time':req_time,'response_time':res_time,'date':int(date),'hour':int(hour)}

conn.db.log.insert(log)
f.close()
print "mv %s %s "%(l,bak_dir)
os.system("mv %s %s "%(l,bak_dir))
print time.time() - s

if __name__ == '__main__':
lf = readfile(files_dir)
print lf
read_time = readtime(files_dir)
print read_time
handle_log(lf)

我们书接上回,对上面的代码进行一下梳理:

w变量存了一个测试的Nginx日志条目,readfile()函数是读取日志文件,然后返回文件的路径,readtime()函数是获取日期,handle_log()函数是分析日志的函数,对于每个日志段,用正则精心匹配筛选出来,然后就是入库。这里面试写入到了MongDB中。

好了,日志都放到NOSQL当中了,接下来就是分析的问题,这个就是仁者见仁智者见智的事了,每个公司的需求不一样,有用redis分析的,有用zeromq分析,这就看大家的喜好了,分析完最后还是推荐大家用highcharts出图比较好看,这里推荐使用highcharts的文章:highcharts使用

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
flume是一个分布式、可靠、高可用的数据采集、聚合和传输系统。在数据采集方面,flume可以很好地与nginx、kafka、mongodb等常见的数据处理工具和数据库进行集成。下面介绍一下基于nginx+flume+kafka+mongodb实现埋点数据采集的步骤: 1. 配置nginx服务器,将所有的http请求都转发到flume服务器上。可以使用nginx的proxy_pass指令来实现。 2. 在flume服务器上,配置flume agent来接收nginx服务器转发过来的http请求,并将请求数据转发给kafka服务器。flume的配置文件中需要设置source、channel和sink三个部分,具体配置可以参考flume官方文档。 3. 在kafka服务器上,创建一个topic来存储flume发送过来的http请求数据。可以使用kafka的命令行工具kafka-topics来创建topic。 4. 在flume服务器上,配置一个kafka sink来将http请求数据发送到kafka服务器上的指定topic中。 5. 在mongodb数据库中创建一个collection来存储http请求数据。可以使用mongodb的命令行工具mongo来创建collection。 6. 在flume服务器上,配置一个mongodb sink来将http请求数据从kafka服务器中消费,并将其存储到mongodb数据库中的指定collection中。 7. 启动nginx、flume、kafka和mongodb服务,并进行测试。可以使用curl等工具模拟http请求,并查看数据是否能够被成功采集、存储到mongodb中。 以上就是基于nginx+flume+kafka+mongodb实现埋点数据采集的基本步骤。需要注意的是,具体的配置和实现过程可能会因为不同的业务需求而有所差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值