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 相关文章推荐
利用ctypes提高Python的执行速度
Sep 09 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 Python
Python将多个excel文件合并为一个文件
Jan 03 Python
python爬虫中get和post方法介绍以及cookie作用
Feb 08 Python
numpy中的高维数组转置实例
Apr 17 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
python用fsolve、leastsq对非线性方程组求解
Dec 15 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
Jul 25 Python
python树的同构学习笔记
Sep 14 Python
Django 实现Admin自动填充当前用户的示例代码
Nov 18 Python
python 函数中的参数类型
Feb 11 Python
python链表类中获取元素实例方法
Feb 23 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
隐性调用php程序的方法
2015/06/13 PHP
jquery 图片轮换效果
2010/07/29 Javascript
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
innerText 使用示例
2014/01/23 Javascript
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
微信公众号 客服接口的开发实例详解
2016/09/28 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
vant实现购物车功能
2020/06/29 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
python difflib模块示例讲解
2017/09/13 Python
Python线程创建和终止实例代码
2018/01/20 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
小学运动会表扬稿
2014/01/19 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书