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使用PIL缩放网络图片并保存的方法
Apr 24 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 Python
深入解析Python小白学习【操作列表】
Mar 23 Python
Python转换时间的图文方法
Jul 01 Python
Python Web框架之Django框架Model基础详解
Aug 16 Python
python计算导数并绘图的实例
Feb 29 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
Mar 10 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
Jul 02 Python
利用python为PostgreSQL的表自动添加分区
Jan 18 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
May 31 Python
Python并发编程实例教程之线程的玩法
Jun 20 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编写的SVN类
2013/07/18 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
2013/11/18 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
AngularJS基础 ng-show 指令简单示例
2016/08/03 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
[22:59]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python素数检测的方法
2015/05/11 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
python实现学生信息管理系统
2020/04/05 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
python频繁写入文件时提速的方法
2019/06/26 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
python实现按关键字筛选日志文件
2019/12/24 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
中层干部竞争上岗演讲稿
2014/01/13 职场文书
排查整治工作方案
2014/06/09 职场文书
学习教师法的心得体会
2014/09/03 职场文书
步步惊心观后感
2015/06/12 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
导游词之寿县报恩寺
2020/01/19 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python