近日有一个需求,分析nginx的访问日志并做一些统计,以下脚本是写来按每分钟读取nginx的日志并发送到server端。
操作系统用的是CentOS6.5,默认python版本2.6,不带requests库。
requests的安装方法:
wget –no-check-certificate https://github.com/pypa/pip/archive/1.5.5.tar.gz
tar zvxf 1.5.5.tar.gz
cd pip-1.5.5/
python setup.py install
pip install requests
以下为日志采集的脚本,有很多可优化的地方,后期修正。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import commands
import sqlite3
import requests
import urllib2
#param[0]:113.122.233.73 访客IP地址
#param[1]:[11/Apr/2016:15:11:08 访问时间
#param[2]:POST 请求方式
#param[3]:/getUrl 请求的接口
def log_analyse(token):
url = 'http://127.0.0.1/jnginx/rec/access/log/?'
time_str = time.time()
time_str_tmp = time.localtime(time_str)
time_str = time.strftime("%d/%b/%Y:%H:%M:%S", time_str_tmp)
date_pre = time.strftime("%d/%b/%Y:%H:", time_str_tmp)
minute = time.strftime("%M", time_str_tmp)
minute = int(minute)
if minute == 0:
minute_start = 59
else:
minute_start = minute - 1
cmd = 'cat access.log |grep "{0}{1}:[00-59]"'.format(date_pre, minute_start)
status, res = commands.getstatusoutput(cmd)
if res:
log_detail_tmp = res.split('\n')
for log_detail in log_detail_tmp:
cmd_echo = "echo %s | awk '{print $1;print $3;print $5;print $6;}'" % log_detail
status_echo, res_echo = commands.getstatusoutput(cmd_echo)
param = res_echo.split('\n')
province = check_ip({'ip': param[0]})
access_time = param[1].replace('[', '')
api = param[3]
access_url = url+'token={0}&ip={1}&province={2}&access_time={3}&api={4}'.format(token,param[0],province,access_time,api,0)
urllib2.urlopen(access_url)
# print access_url
else:
print cmd
return
def check_ip(ip):
url = 'http://ip.taobao.com/service/getIpInfo.php'
try:
r = requests.get(url, params=ip, timeout=3)
except requests.RequestException as e:
print e
else:
json_data = r.json()
if json_data[u'code'] == 0:
return json_data[u'data'][u'region'].encode('utf-8')
# print '所在国家: ' + json_data[u'data'][u'country'].encode('utf-8')
# print '所在地区: ' +json_data[u'data'][u'area'].encode('utf-8')
# print '所在省份: ' +json_data[u'data'][u'region'].encode('utf-8')
# print '所在城市: ' +json_data[u'data'][u'city'].encode('utf-8')
# print '所属运营商:' +json_data[u'data'][u'isp'].encode('utf-8')
else:
# print '查询失败,请稍后再试!'
return ''
return
token = 'token'
log_analyse(token)
相比于一段时间回传一次数据,每分钟回传一次数据可以相对的均摊服务器的压力,否则每次要处理一大堆日志有可能会使服务器处理业务的速度相对变慢甚至宕机。
用百度echarts画出来的图还是比较炫酷的,但是有时候echarts官网很不稳定,打开比较费事,这里有echarts2的所有官方示例的源码echarts2官方示例源码,方便以后查找。