python正则分析nginx的访问日志


Posted in Python onJanuary 17, 2017

前言

本文的脚本是分析nginx的访问日志, 主要为了检查站点uri的访问次数的,检查的结果会提供给研发人员做参考,因为谈到分析嘛,那肯定要用到正则表达式了,所以请没有接触过正则的小伙伴自行补脑,因为涉及正则的内容,实在没法展开写,正则的内容太过庞大,根本不是一篇两篇能写清楚的。

开始前,我们先看看要分析的日志结构:

127.0.0.1 - - [19/Jun/2012:09:16:22 +0100] "GET /GO.jpg HTTP/1.1" 499 0 "http://domain.com/htm_data/7/1206/758536.html" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; SE 2.X MetaSr 1.0)"
127.0.0.1 - - [19/Jun/2012:09:16:25 +0100] "GET /Zyb.gif HTTP/1.1" 499 0 "http://domain.com/htm_data/7/1206/758536.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; QQDownload 711; SV1; .NET4.0C; .NET4.0E; 360SE)"

这是修改过的日志内容,敏感内容都以删除或替换了,不过不影响我们的分析结果,当然格式什么的这都不重要,Nginx访问日志是可以自定义的,每家公司可能都会稍有不同,所以要能理解脚本内容,并通过自己修改应用到了自己工作中才是重点,我给的日志格式也就是个参考,我打赌你在你公司服务器上看到的日志格式肯定跟我的格式不一样, 看完日志格式,我们开始要写我们的脚本了

我先贴代码,稍后解释:

import re
from operator import itemgetter
 
def parser_logfile(logfile):
 pattern = (r''
   '(\d+.\d+.\d+.\d+)\s-\s-\s' #IP address
   '\[(.+)\]\s' #datetime
   '"GET\s(.+)\s\w+/.+"\s' #requested file
   '(\d+)\s' #status
   '(\d+)\s' #bandwidth
   '"(.+)"\s' #referrer
   '"(.+)"' #user agent
  )
 fi = open(logfile, 'r')
 url_list = []
 for line in fi:
  url_list.append(re.findall(pattern, line))
 fi.close()
 return url_list
 
def parser_urllist(url_list):
 urls = []
 for url in url_list:
  for r in url: 
   urls.append(r[5])
 return urls
 
def get_urldict(urls):
 d = {}
 for url in urls:
  d[url] = d.get(url,0)+1
 return d
 
def url_count(logfile):
 url_list = parser_logfile(logfile)
 urls = parser_urllist(url_list)
 totals = get_urldict(urls)
 return totals
 
if __name__ == '__main__':
 urls_with_counts = url_count('example.log')
 sorted_by_count = sorted(urls_with_counts.items(), key=itemgetter(1), reverse=True)
 print(sorted_by_count)

脚本解释,parser_logfile()函数功能是分析日志,返回匹配的行列表,正则部分就不解释了,大家看注释应该知道它是匹配什么内容的,parser_urllist()函数功能是将获取用户访问的url,get_urldict()函数功能是返回一个字典,以url为键,如果键相同值增1,返回的字典是每个url和最大的访问次数,url_count()函数功能就是调用了之前定义的函数,主函数部分,就说说itemgetter,它可以实现按指定元素进行排序,举例就明白了:

>>> from operator import itemgetter
>>> a=[('b',2),('a',1),('c',0)] 
>>> s=sorted(a,key=itemgetter(1))
>>> s
[('c', 0), ('a', 1), ('b', 2)]
>>> s=sorted(a,key=itemgetter(0))
>>> s
[('a', 1), ('b', 2), ('c', 0)]

reverse=True参数表示降序排序,就是从大到小排序,脚本运行结果:

[('http://domain.com/htm_data/7/1206/758536.html', 141), ('http://domain.com/?q=node&page=12', 3), ('http://website.net/htm_data/7/1206/758536.html', 1)]

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python基于twisted实现简单的web服务器
Sep 29 Python
Python的re模块正则表达式操作
May 25 Python
Java及python正则表达式详解
Dec 27 Python
使用Python监控文件内容变化代码实例
Jun 04 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
Dec 11 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
关于python的缩进规则的知识点详解
Jun 22 Python
Python极值整数的边界探讨分析
Sep 15 Python
Python面向对象编程之类的概念
Nov 01 Python
你应该知道的python列表去重方法
Jan 17 #Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 #Python
Python Socket传输文件示例
Jan 16 #Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 #Python
python一键升级所有pip package的方法
Jan 16 #Python
centos6.7安装python2.7.11的具体方法
Jan 16 #Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 #Python
You might like
实用函数4
2007/11/08 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
PHP关联数组的10个操作技巧
2013/01/21 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
javascript高亮效果的二种实现方法
2008/09/14 Javascript
封装的原生javascript弹出层代码
2010/09/24 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
uploadify 3.0 详细使用说明
2012/06/18 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
2014/03/12 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
javascript闭包入门示例
2014/04/30 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
JavaScript中的对象和原型(一)
2016/08/12 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
使用vue中的v-for遍历二维数组的方法
2018/03/07 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
学习python处理python编码问题
2011/03/13 Python
Python复制文件操作实例详解
2015/11/10 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
python中re模块知识点总结
2021/01/17 Python
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
文体活动总结
2015/02/04 职场文书
《秋天的图画》教学反思
2016/02/19 职场文书
公证书
2019/04/17 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python