Python解析nginx日志文件


Posted in Python onMay 11, 2015

项目的一个需求是解析nginx的日志文件。
简单的整理如下:

日志规则描述

首先要明确自己的Nginx的日志格式,这里采用默认Nginx日志格式:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
          '$status $body_bytes_sent "$http_referer" '
          '"$http_user_agent" "$http_x_forwarded_for"';

其中一条真实记录样例如下:

172.22.8.207 - - [16/Dec/2014:17:57:35 +0800] "GET /report?DOmjjuS6keWJp+WculSQAgdUkAIPODExMzAwMDJDN0FC HTTP/1.1" 200 0 "-" "XXXXXXX/1.0.16; iPhone/iOS 8.1.2; ; 8DA77E2F91D0"

其中,客户端型号信息用XXXXXXX代替。

项目中已经按照业务规则对Nginx日志文件进行了处理命名规则如下:

ID-ID-YYMMDD-hhmmss
并且所有的日志文件存放在统一路径下。

解决思路

获取所有日志文件path

这里使用Python的glob模块来获取日志文件path

import glob
def readfile(path):
  return glob.glob(path + '*-*-*-*')

获取日志文件中每一行的内容

使用Python的linecache模块来获取文件行的内容

import linecache


def readline(path):
  return linecache.getlines(path)

注意:linecache模块使用了缓存,所以存在以下问题:

在使用linecache模块读取文件内容以后,如果文件发生了变化,那么需要使用linecache.updatecache(filename)来更新缓存,以获取最新变化。

linecache模块使用缓存,所以会耗费内存,耗费量与要解析的文件相关。最好在使用完毕后执行linecache.clearcache()清空一下缓存。

当然,作为优化,这里可以利用生成器来进行优化。暂且按下不表。

处理日志条目

一条日志信息就是一个特定格式的字符串,因此使用正则表达式来解析,这里使用Python的re模块。
下面,一条一条建立规则:

规则

ip = r"?P<ip>[\d.]*"
  date = r"?P<date>\d+"
  month = r"?P<month>\w+"
  year = r"?P<year>\d+"
  log_time = r"?P<time>\S+"
  method = r"?P<method>\S+"
  request = r"?P<request>\S+"
  status = r"?P<status>\d+"
  bodyBytesSent = r"?P<bodyBytesSent>\d+"
  refer = r"""?P<refer>
       [^\"]*
       """
  userAgent=r"""?P<userAgent>
        .*
        """

解析

p = re.compile(r"(%s)\ -\ -\ \[(%s)/(%s)/(%s)\:(%s)\ [\S]+\]\ \"(%s)?[\s]?(%s)?.*?\"\ (%s)\ (%s)\ \"(%s)\"\ \"(%s).*?\"" %( ip, date, month, year, log_time, method, request, status, bodyBytesSent, refer, userAgent ), re.VERBOSE)

m = re.findall(p, logline)

这样,就可以得到日志条目中各个要素的原始数据。

格式及内容转化

得到日志原始数据之后,需要根据业务要求,对原始数据进行格式及内容转化。
这里需要处理的内容包括:时间,request,userAgent

时间格式转化

在日志信息原始数据中存在Dec这样的信息,利用Python的time模块可以方便的进行解析

import time
def parsetime(date, month, year, log_time):
  time_str = '%s%s%s %s' %(year, month, date, log_time)
  return time.strptime(time_str, '%Y%b%d %H:%M:%S')

解析request

在日志信息原始数据中得到的request的内容格式为:

/report?XXXXXX
这里只需要根据协议取出XXXXXX即可。
这里仍然采用Python的re模块

import re
def parserequest(rqst):
  param = r"?P<param>.*"
  p = re.compile(r"/report\?(%s)" %param, re.VERBOSE)
  return re.findall(p, rqst)

接下来需要根据业务协议解析参数内容。这里需要先利用base64模块解码,然后再利用struct模块解构内容:

import struct
import base64
def parseparam(param):
  decodeinfo = base64.b64decode(param)
  s = struct.Struct('!x' + bytes(len(decodeinfo) - (1 + 4 + 4 + 12)) + 'xii12x')
  return s.unpack(decodeinfo)

解析userAgent

在日志信息原始数据中userAgent数据的格式为:

XXX; XXX; XXX; XXX
根据业务要求,只需要取出最后一项即可。
这里采用re模块来解析。

import re
def parseuseragent(useragent):
  agent = r"?P<agent>.*"
  p = re.compile(r".*;.*;.*;(%s)" %agent, re.VERBOSE)
  return re.findall(p, useragent)

至此,nginx日志文件解析基本完成。
剩下的工作就是根据业务需要,对获得的基本信息进行处理。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Python 相关文章推荐
在Python中操作时间之strptime()方法的使用
Dec 30 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
Python实现的批量修改文件后缀名操作示例
Dec 07 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
python区分不同数据类型的方法
Oct 14 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 Python
浅谈pandas dataframe对除数是零的处理
Jul 20 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 Python
python基于OpenCV模板匹配识别图片中的数字
Mar 31 Python
Python字符串替换实例分析
May 11 #Python
Python使用django获取用户IP地址的方法
May 11 #Python
总结Python编程中三条常用的技巧
May 11 #Python
python求解水仙花数的方法
May 11 #Python
pymongo为mongodb数据库添加索引的方法
May 11 #Python
python判断windows系统是32位还是64位的方法
May 11 #Python
Python中使用装饰器时需要注意的一些问题
May 11 #Python
You might like
提升PHP执行速度全攻略(下)
2006/10/09 PHP
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
php制作动态随机验证码
2015/02/12 PHP
PHP的Yii框架中View视图的使用进阶
2016/03/29 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
PHP 图片处理
2020/09/16 PHP
关于Javascript作用域链的八点总结
2013/12/06 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
vue+iview动态渲染表格详解
2019/03/19 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
python处理大日志文件
2019/07/23 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
大学生职业生涯规划范文
2013/12/31 职场文书
《草原》教学反思
2014/02/15 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
质量标语大全
2014/06/12 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
致地震灾区的慰问信
2015/03/23 职场文书
工会文体活动总结
2015/05/07 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python