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 相关文章推荐
Python3实现从指定路径查找文件的方法
May 22 Python
Python3使用requests发闪存的方法
May 11 Python
[原创]使用豆瓣提供的国内pypi源
Jul 02 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
解决pycharm 误删掉项目文件的处理方法
Oct 22 Python
pycharm 取消默认的右击运行unittest的方法
Nov 29 Python
Python实现的KMeans聚类算法实例分析
Dec 29 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
Aug 26 Python
python实现图片横向和纵向拼接
Mar 05 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
Oct 31 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
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
基于PHP与XML的PDF文档生成技术
2006/10/09 PHP
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
基于jquery的loading效果实现代码
2010/11/05 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
JS中字符串trim()使用示例
2015/05/26 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
vue小白入门教程
2018/04/02 Javascript
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
node后端服务保活的实现
2019/11/10 Javascript
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
初学Python函数的笔记整理
2015/04/07 Python
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
python对视频画框标记后保存的方法
2018/12/07 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
2020/09/25 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
小学生综合素质评语
2014/04/23 职场文书
保护环境建议书100字
2014/05/13 职场文书
消防宣传标语大全
2015/08/03 职场文书
消防安全主题班会
2015/08/12 职场文书
诚信考试主题班会
2015/08/17 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书