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实现bitmap数据结构详解
Feb 17 Python
python中的__slots__使用示例
Feb 26 Python
Python开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
Jun 23 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
python通过ffmgep从视频中抽帧的方法
Dec 05 Python
利用arcgis的python读取要素的X,Y方法
Dec 22 Python
django模板加载静态文件的方法步骤
Mar 01 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
python接入支付宝的实例操作
Jul 20 Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 Python
golang中的空接口使用详解
Mar 30 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实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
[原创]图片分页查看
2006/08/28 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
JS实现上下左右对称的九九乘法表
2016/02/22 Javascript
JS之相等操作符详解
2016/09/13 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
js实现图片放大展示效果
2017/08/30 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
Python中__name__的使用实例
2015/04/14 Python
python实现图像识别功能
2018/01/29 Python
Python入门学习指南分享
2018/04/11 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
python字符串替换第一个字符串的方法
2019/06/26 Python
python和c语言哪个更适合初学者
2020/06/22 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
2014年父亲节活动方案
2014/03/06 职场文书
保密承诺书
2014/03/27 职场文书
政府门卫岗位职责
2014/04/29 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
MySQL七种JOIN类型小结
2021/10/24 MySQL