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 subprocess模块详细解读
Jan 29 Python
对python中list的拷贝与numpy的array的拷贝详解
Jan 29 Python
Django框架实现的分页demo示例
May 25 Python
python 遍历pd.Series的index和value
Nov 26 Python
pytorch标签转onehot形式实例
Jan 02 Python
详解有关PyCharm安装库失败的问题的解决方法
Feb 02 Python
python的Jenkins接口调用方式
May 12 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
Jun 28 Python
Python调用C语言程序方法解析
Jul 07 Python
Python 高效编程技巧分享
Sep 10 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 Python
python实现会员信息管理系统(List)
Mar 18 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
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
php画图实例
2014/11/05 PHP
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
python分析nignx访问日志脚本分享
2015/02/26 Python
浅述python中argsort()函数的实例用法
2017/03/30 Python
使用python实现个性化词云的方法
2017/06/16 Python
Python入门之三角函数sin()函数实例详解
2017/11/08 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
简单了解python单例模式的几种写法
2019/07/01 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
2020/05/29 Python
PyQt5实现画布小程序
2020/05/30 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
J2EE面试题大全
2016/08/06 面试题
幼儿园清明节活动总结
2014/07/04 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫