近日有一個需求,分析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官方示例源碼,方便以後查找。