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 MD5文件生成码
Jan 12 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
Python中的默认参数实例分析
Jan 29 Python
对numpy中布尔型数组的处理方法详解
Apr 17 Python
TensorFlow实现简单卷积神经网络
May 24 Python
python实现txt文件格式转换为arff格式
May 31 Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 Python
只需7行Python代码玩转微信自动聊天
Jan 27 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 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新手上路(十四)
2006/10/09 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
plt.figure()参数使用详解及运行演示
2021/01/08 Python
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
阿波罗盒子:Apollo Box
2017/08/14 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
中学生学习生活的自我评价
2013/10/26 职场文书
车间副主任岗位职责
2013/12/24 职场文书
大学校园毕业自我鉴定
2014/01/15 职场文书
工厂车间标语
2014/06/19 职场文书
就业协议书样本
2014/08/20 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
Nginx域名转发使用场景代码实例
2021/03/31 Servers
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers