通过python操作GeoLite2-City.mmdb库将nginx日志写入数据库

# 创建存放nginx日志的表accesslog2

CREATE TABLE `accesslog2` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`logtime` datetime DEFAULT NULL,
`ip` varchar(128) DEFAULT NULL,
`url` text,
`status` int(11) DEFAULT NULL,
`lat` float DEFAULT NULL,
`lng` float DEFAULT NULL,
`city` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=896 DEFAULT CHARSET=utf8;

# 安装geoip2模块
# sudo pip2 install geoip2

#encoding=utf-8

import time
import geoip2.database from dbutils import MysqlConnection # 找出ip所在城市的日志处理
def log_2db_4map(log_file):
# 清空数据库信息
MysqlConnection.execute_sql('truncate table accesslog2')
path=log_file
shandle = open(path, 'r')
log_dict = {} # 读取ip数据库
reader = geoip2.database.Reader('GeoLite2-City.mmdb') while True:
line = shandle.readline()
if line == '':
break
_nodes = line.split() # 访问url,来访ip,http状态码,访问时间
_url,_ip,_status,_lgtime = _nodes[6], _nodes[0], _nodes[8],_nodes[3][1:] # 将日志访问的时间"22/Oct/2017:03:28:01"转成 2017-11-23 10:08:18 类似的格式
_ltime = time.strftime('%Y-%m-%d %H:%M:%S',time.strptime(_lgtime,'%d/%b/%Y:%H:%M:%S'))
# 获取城市信息
try:
response = reader.city(_ip)
# 如果国家不是中国跳出本次循环
if 'China' != response.country.name:
continue
# 获取城市
_city = response.city.names.get('zh-CN','')
if _city == '':
print 'ip: %s city is empty' % _ip
continue
# 获取经度和纬度
_lat = response.location.latitude
_lng = response.location.longitude
# print response
except Exception as e:
print 'goe has not %s info' % _ip _args = (_ltime,_ip,_url,_status, _lat,_lng,_city)
# 插入数据库语句
sql = 'insert into accesslog2(logtime, ip, url,status,lat,lng,city) values(%s, %s, %s,%s,%s,%s,%s)'
MysqlConnection.execute_sql(sql, _args) # 关闭文件句柄
shandle.close() # 文件入口
if __name__ == '__main__':
# nginx日志文件
log_file = 'www_access.log'
rt_list = log_2db_4map(log_file = log_file)

连接数据库和操作数据库的底层模块参考:
python操作mysql数据库增删改查的dbutils实例
http://www.cnblogs.com/reblue520/p/7884365.html

通过python操作GeoLite2-City.mmdb库将nginx日志访问IP转换为城市写入数据库的更多相关文章

  1. python 操作excle 之第三方库 openpyxl学习

    目录 python 操作excle 之第三方库 openpyxl学习 安装 pip install openpyxl 英文文档链接 : 点击这里~ 1,定位excel 2,读取excle中的内容 3, ...

  2. 操作文件-取出一个60s内log日志中ip访问次数超过100次的ip

    import timea=0while True: d={} f = open(r"/Users/**juan/Downloads/access.log",encoding=&qu ...

  3. 数据库之redis篇(3)—— Python操作redis

    虽然前面两篇已经说了redis的一些配置安装什么的,篇幅有点长,可能看完了也不知道怎么操作,这里再浓缩一下: 什么是redis redis完全开源免费的,遵守BSD协议,是一个高性能的非关系型key- ...

  4. 【踩坑记录】记录一次使用Python logging库多进程打印日志的填坑过程

    背景: 项目使用Python自带的logging库来打印日志 项目部署在一台Centos7的机器上 项目采用gunicorn多进程部署 过程: 1.LOG日志代码封装: 采用logging库,并设置w ...

  5. 学会用Python操作Mongodb

    在linux下,用pip导包. pip install pymongo python操作基本步骤: 导包 建立连接,建立客户端. 获取数据库 获取集合 对数据操作 import pymongo #建立 ...

  6. 利用python分析nginx日志

    最近在学习python,写了个脚本分析nginx日志,练练手.写得比较粗糙,但基本功能可以实现. 脚本功能:查找出当天访问次数前十位的IP,并获取该IP来源,并将分析结果发送邮件到指定邮箱. 实现前两 ...

  7. python操作Excel,你觉得哪个库更好呢?

    对比学习python,更高效~ Excel数据的类型及组织方式 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知 ...

  8. Python 操作 MS Excel 文件

    利用 Python 对 Excel 文件进行操作需要使用第三方库: openpyxl,可执行 pip install openpyxl 进行安装 1. 导入 openpyxl 模块 导入 openpy ...

  9. python学习笔记-(十六)python操作mysql

    一. mysql安装 1. windows下安装mysql 1.1. 下载源: http://dev.mysql.com/downloads/installer/,请认准对应版本 Windows (x ...

随机推荐

  1. Chrome DevTools: Color tricks in the Elements Panel

    shift + click to change the color format Tip one The Colour Platters are customeised for you .they s ...

  2. Java技能

    1.思维导图 Java知识思维导图 2 3.Java理解 深入理解Java:注解(Annotation)自定义注解入门 4.JAVA数据类型 基本数据类型 布尔类型:boolean 数值类型: 定点类 ...

  3. 有关mysql的innodb_flush_log_at_trx_commit参数

    一.参数解释 0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下在事务提交的时候,不会主动触发写入磁盘的操作. 1:每次事务 ...

  4. 【leetcode-101】 对称二叉树

    101. 对称二叉树 (1过) 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [ ...

  5. 外部程序调用Django模块的解决办法

    Question django.core.exceptions.ImproperlyConfigured: Requested setting CACHES, but settings are not ...

  6. 二十、Linux 进程与信号---非局部跳转

    20.1 setjmp 和 longjmp 函数 20.1.1 函数介绍 #include <setjmp.h> int setjmp(jmp_buf env); 函数功能:设置非局部跳转 ...

  7. Docker --rm 自动清理容器内部临时文件

    在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据. 清除断掉链接的容器缓存

  8. 第20月第14天 objc_getAssociatedObject _cmd

    1. - (CustomNavigationControllerDelegate *)customDelegate { return objc_getAssociatedObject(self, _c ...

  9. python 装饰器前之闭包和装饰器

      装饰器: 一, 例如: # vim yue7.py def foo(): print ("fool-------------------") foo() 运行: [root@l ...

  10. 【vue】中 $parent 和 $children 的使用方法

    <div id="app"> A{{msg}} <my-button :msg="msg"></my-button> < ...