Python 分析Nginx访问日志并保存到MySQL数据库实例


Posted in Python onMarch 13, 2014

使用Python 分析Nginx access 日志,根据Nginx日志格式进行分割并存入MySQL数据库。
一、Nginx access日志格式如下:

$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"' #使用的是nginx默认日志格式

二、Nginx access 日志内容如下:
182.19.31.129 - - [2013-08-13T00:00:01-07:00] "GET /css/anniversary.css HTTP/1.1" 304 0 "http://www.chlinux.net/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36" "-"

三、下面是Python 分析nginx日志的Python代码:
#!/usr/bin/env python
#coding:utf8
import os
import fileinput
import re
import sys
import MySQLdb
#日志的位置
logfile=open("access_20130812.log")
#使用的nginx默认日志格式$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"'
#日志分析正则表达式
#203.208.60.230
ipP = r"?P<ip>[\d.]*"
#以[开始,除[]以外的任意字符 防止匹配上下个[]项目(也可以使用非贪婪匹配*?) 不在中括号里的.可以匹配换行外的任意字符 *这样地重复是"贪婪的“ 表达式引擎会试着重复尽可能多的次数。#以]结束
#[21/Jan/2011:15:04:41 +0800]
timeP = r"""?P<time>\[[^\[\]]*\]"""
#以"开始, #除双引号以外的任意字符 防止匹配上下个""项目(也可以使用非贪婪匹配*?),#以"结束
#"GET /EntpShop.do?method=view&shop_id=391796 HTTP/1.1"
#"GET /EntpShop.do?method=view&shop_id=391796 HTTP/1.1"
requestP = r"""?P<request>\"[^\"]*\""""
statusP = r"?P<status>\d+"
bodyBytesSentP = r"?P<bodyByteSent>\d+"
#以"开始, 除双引号以外的任意字符 防止匹配上下个""项目(也可以使用非贪婪匹配*?),#以"结束
#"http://test.myweb.com/myAction.do?method=view&mod_id=&id=1346"
referP = r"""?P<refer>\"[^\"]*\""""
#以"开始, 除双引号以外的任意字符 防止匹配上下个""项目(也可以使用非贪婪匹配*?),以"结束
#"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"'
userAgentP = r"""?P<userAgent>\"[^\"]*\""""
#以(开始, 除双引号以外的任意字符 防止匹配上下个()项目(也可以使用非贪婪匹配*?),以"结束
#(compatible; Googlebot/2.1; +http://www.google.com/bot.html)"'
userSystems = re.compile(r'\([^\(\)]*\)')
#以"开始,除双引号以外的任意字符防止匹配上下个""项目(也可以使用非贪婪匹配*?),以"结束
userlius = re.compile(r'[^\)]*\"')
#原理:主要通过空格和-来区分各不同项目,各项目内部写各自的匹配表达式
nginxLogPattern = re.compile(r"(%s)\ -\ -\ (%s)\ (%s)\ (%s)\ (%s)\ (%s)\ (%s)" %(ipP, timeP, requestP, statusP, bodyBytesSentP, referP, userAgentP), re.VERBOSE)
#数据库连接信息
conn=MySQLdb.connect(host='192.168.1.22',user='test',passwd='pass',port=3306,db='python')
cur=conn.cursor()
sql = "INSERT INTO python.test VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)"
while True:
    line = logfile.readline()
    if not line:break
    matchs = nginxLogPattern.match(line)
    if matchs != None:
        allGroup = matchs.groups()
        ip = allGroup[0]
        time = allGroup[1]
        request = allGroup[2]
        status = allGroup[3]
        bodyBytesSent = allGroup[4]
        refer = allGroup[5]
        userAgent = allGroup[6]
        Time = time.replace('T',' ')[1:-7]
        if len(userAgent) > 20:
            userinfo = userAgent.split(' ')
            userkel =  userinfo[0]
            try:
                usersystem = userSystems.findall(userAgent)
                usersystem = usersystem[0]
                print usersystem
                userliu = userlius.findall(userAgent)
                value = [ip,Time,request,status,bodyBytesSent,refer,userkel,usersystem,userliu[1]]
                conn.commit()
                print value
            except IndexError:
                userinfo = userAgent
                value = [ip,Time,request,status,bodyBytesSent,refer,userinfo,"",""]
        else:
            useraa = userAgent
            value = [ip,Time,request,status,bodyBytesSent,refer,useraa,"",""]
    try:
        result = cur.execute(sql,value)
        #conn.commit()
        print result
    except MySQLdb.Error,e:
        print "Mysql Error %d: %s" % (e.args[0], e.args[1])
conn.commit()
conn.close()

四、存入数据库后数据是如下图:

Python 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
在python中按照特定顺序访问字典的方法详解
Dec 14 Python
Python requests模块实例用法
Feb 11 Python
Django 创建新App及其常用命令的实现方法
Aug 04 Python
Django 框架模型操作入门教程
Nov 05 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
用 Python 制作地球仪的方法
Apr 24 Python
python绘制趋势图的示例
Sep 17 Python
pandas中DataFrame检测重复值的实现
May 26 Python
详解Python中的__init__和__new__
Mar 12 #Python
python文件和目录操作方法大全(含实例)
Mar 12 #Python
Python 文件读写操作实例详解
Mar 12 #Python
Python 异常处理实例详解
Mar 12 #Python
Python break语句详解
Mar 11 #Python
Python continue语句用法实例
Mar 11 #Python
Python pass 语句使用示例
Mar 11 #Python
You might like
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
php使用ereg验证文件上传的方法
2014/12/16 PHP
PHP中的浅复制与深复制的实例详解
2017/10/26 PHP
设定php简写功能的方法
2019/11/28 PHP
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
使用window.prompt()实现弹出用户输入的对话框
2015/04/13 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
2015/10/22 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
koa-router源码学习小结
2018/09/07 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
python简单实现刷新智联简历
2016/03/30 Python
深入学习Python中的装饰器使用
2016/06/20 Python
理论讲解python多进程并发编程
2018/02/09 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
python获取Pandas列名的几种方法
2019/08/07 Python
python 表格打印代码实例解析
2019/10/12 Python
python 常见的排序算法实现汇总
2020/08/21 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
python实现文件分片上传的接口自动化
2020/11/19 Python
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
有模特经验的简历自我评价
2013/09/19 职场文书
幼儿园保教管理制度
2014/02/03 职场文书
2014国培学习感言
2014/03/05 职场文书
运输服务质量承诺书
2014/03/27 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL