您的位置:首页 > 运维架构 > Nginx

python分析nginx日志的ip(上篇)

2015-12-09 00:00 771 查看
摘要: 功能需求:获取网站日志中的ip,查询归属地,统计ip访问次数等把每天的信息保存到数据库里面。ip库用的是淘宝的,代码运行和网络有很大关系。也可以统计ip所属运营商,国家码,城市码等

很早之前就想写个有这样功能的程序了。。。。。。

直到在一个漆黑的夜里。。。。。。。看了一个大姐写了统计ip归属地的代码。。。。。。。

我的日志是每天轮询一次,生成新的log,所以我的数据库中的时间信息,记录的是我代码执行时插入的时间。

代码执行结果如下:



数据库中的信息如下:



数据样本:日志中的格式大概如下



代码如下

#!/usr/bin env python
# coding: utf-8
import MySQLdb as mysql
import datetime
import sys, os, urllib2, json

db = mysql.connect(user="root",passwd="123456",db="intest",host="localhost") #数据库连接信息
db.autocommit(True)
cur = db.cursor()
cur.execute('set names utf8')
addtime = datetime.datetime.now()

ips = {} #ip作为字典的key,访问次数做value
iplist = [] #遍历日志中的ip,相同的ip也会记录到列表,插入数据库
fh = open("/root/king/03.log", "r").readlines() #我的是把日志和代码在一个目录下面
for line in fh:
ip = line.split(" ")[0]
if 6 < len(ip) <=15:
ips[ip] = ips.get(ip, 0) + 1
alist = iplist.append(ip)
for key,value in ips.items():
listinfo = str(ips)
sql = 'insert into ipinfo(ipaddress,countip) value ("%s","%s")' % (key,value)
cur.execute(sql)

def get_ip_area(ip):
try:
apiurl = "http://ip.taobao.com/service/getIpInfo.php?ip=%s" %ip
content = urllib2.urlopen(apiurl).read()
data = json.loads(content)['data']
code = json.loads(content)['code']
if code == 0: # success
country=(data['country'])
area = (data['area'])
region = (data['region'])
city = (data['city'])
ip = (data['ip'])
print(data['country']),(data['area']),(data['region']),(data['city']),(data['ip'])
sql = 'insert into whereip (country,area,region,city,ip,time) value ("%s","%s","%s","%s","%s","%s")' % (country.encode("utf-8"),area.encode("utf-8"),region.encode("utf-8"),city.encode("utf-8"),ip.encode("utf-8"),addtime)
cur.execute(sql)
print 'ok'
else:
print(data)
except Exception as ex:
print(ex)

if __name__ == '__main__':
for ip in iplist:
get_ip_area(ip)

数据库中的建表语句,和表结构如下。

create table ipinfo(id int auto_increment primary key,ipaddress varchar(200),countip int);

create table whereip(id int primary key auto_increment,country varchar(100),area varchar(100),region varchar(100),city varchar(100),ip varchar(100),time datetime);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: