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处理csv数据的方法
Mar 11 Python
详解Python中的__new__、__init__、__call__三个特殊方法
Jun 02 Python
python使用json序列化datetime类型实例解析
Feb 11 Python
Python基础教程之利用期物处理并发
Mar 29 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
Flask实现跨域请求的处理方法
Sep 27 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
Pytorch高阶OP操作where,gather原理
Apr 30 Python
解决Python 写文件报错TypeError的问题
Oct 23 Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
Apr 13 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
基于curl数据采集之单页面采集函数get_html的使用
2013/04/28 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
javascript getElementsByClassName函数
2010/04/01 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
javascript控制台详解
2015/06/25 Javascript
js实现的页面矩阵图形变换特效
2016/01/26 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
Vue数据驱动模拟实现1
2017/01/11 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
Python实现网站注册验证码生成类
2017/06/08 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
举例讲解Python常用模块
2019/03/08 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
如何验证python安装成功
2020/07/06 Python
python list的index()和find()的实现
2020/11/16 Python
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
给领导的检讨书
2014/02/16 职场文书
声乐专业大学生职业生涯规划书:理想的未来需要自己去打造
2014/09/20 职场文书
开场白怎么写
2015/06/01 职场文书
人生感悟经典句子
2019/08/20 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang
鸿蒙3.0体验感怎么样? 鸿蒙3.0系统评测向
2022/08/14 数码科技