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批量创建迅雷任务及创建多个文件
Feb 13 Python
python下读取公私钥做加解密实例详解
Mar 29 Python
python实现FTP服务器服务的方法
Apr 11 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
pycharm 取消默认的右击运行unittest的方法
Nov 29 Python
Python 处理图片像素点的实例
Jan 08 Python
python PrettyTable模块的安装与简单应用
Jan 11 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
用pycharm开发django项目示例代码
Jun 13 Python
你可能不知道的Python 技巧小结
Jan 29 Python
基于nexus3配置Python仓库过程详解
Jun 15 Python
分享3个非常实用的 Python 模块
Mar 03 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中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
浅谈PHP链表数据结构(单链表)
2016/06/08 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
奇妙的js
2007/09/24 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
javascript实现简单查找与替换的方法
2015/07/22 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
Vue刷新修改页面中数据的方法
2018/09/16 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
django admin 自定义替换change页面模板的方法
2019/08/23 Python
使用python-pptx包批量修改ppt格式的实现
2020/02/14 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
python中if嵌套命令实例讲解
2021/02/25 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
html5中的一些标签学习(心得)
2016/10/18 HTML / CSS
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
财务工作者先进事迹材料
2014/01/17 职场文书
好媳妇事迹材料
2014/12/24 职场文书
医院科室评语
2015/01/04 职场文书
扬州个园导游词
2015/02/06 职场文书
法律意见书范文
2015/06/04 职场文书
教师网络培训心得体会
2016/01/09 职场文书
Node实现搜索框进行模糊查询
2021/06/28 Javascript