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设置tmpfs来加速项目的教程
Apr 17 Python
python使用matplotlib绘制折线图教程
Feb 08 Python
解读python如何实现决策树算法
Oct 11 Python
浅谈Python中的bs4基础
Oct 21 Python
Python2.7实现多进程下开发多线程示例
May 31 Python
python里 super类的工作原理详解
Jun 19 Python
Python+threading模块对单个接口进行并发测试
Jun 25 Python
Python二进制文件读取并转换为浮点数详解
Jun 25 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
Python脚本实现Zabbix多行日志监控过程解析
Aug 26 Python
python - asyncio异步编程
Apr 06 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 验证图片生成函数
2009/05/21 PHP
超级实用的7个PHP代码片段分享
2012/01/05 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
jQuery select的操作实现代码
2009/05/06 Javascript
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
2018/06/21 Python
对Python中plt的画图函数详解
2018/11/07 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
django框架使用方法详解
2019/07/18 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
Python selenium如何打包静态网页并下载
2020/08/12 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
幼儿园教师自我鉴定
2014/03/20 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
详解分布式系统中如何用python实现Paxos
2021/05/18 Python