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 相关文章推荐
py2exe 编译ico图标的代码
Mar 08 Python
Python实现的ini文件操作类分享
Nov 20 Python
Linux下Python获取IP地址的代码
Nov 30 Python
Python Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
Python CSV模块使用实例
Apr 09 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
Django自定义过滤器定义与用法示例
Mar 22 Python
python得到一个excel的全部sheet标签值方法
Dec 10 Python
Python操作Excel插入删除行的方法
Dec 10 Python
Python中list循环遍历删除数据的正确方法
Sep 02 Python
django-csrf使用和禁用方式
Mar 13 Python
Flask缓存静态文件的具体方法
Aug 02 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&mysql(三)
2006/10/09 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
js获取鼠标点击的位置实现思路及代码
2014/05/09 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
详解在vue-test-utils中mock全局对象
2018/11/07 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
深入理解python中的select模块
2017/04/23 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
利用python编写一个图片主色转换的脚本
2017/12/07 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
python图像处理入门(一)
2019/04/04 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
禁烟标语大全
2014/06/11 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
2015年个人思想总结
2015/03/09 职场文书