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牛刀小试密码爆破
Feb 03 Python
Python格式化css文件的方法
Mar 10 Python
在Python中用has_key()方法查找键是否存在的教程
May 21 Python
python中利用队列asyncio.Queue进行通讯详解
Sep 10 Python
Python3解决棋盘覆盖问题的方法示例
Dec 07 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
Python调用钉钉自定义机器人的实现
Jan 03 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
Apr 14 Python
Django如何使用redis作为缓存
May 21 Python
python实现学生成绩测评系统
Jun 22 Python
python脚本框架webpy的url映射详解
Nov 20 Python
python开发人人对战的五子棋小游戏
May 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抓即时股票信息
2006/10/09 PHP
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
js 深拷贝函数
2008/12/04 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
使用Python的Supervisor进行进程监控以及自动启动
2014/05/29 Python
python基础教程之常用运算符
2014/08/29 Python
使用Python的判断语句模拟三目运算
2015/04/24 Python
python解析xml文件实例分析
2015/05/27 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
python 循环while和for in简单实例
2016/08/16 Python
Python 通配符删除文件的实例
2018/04/24 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
详细分析Python collections工具库
2020/07/16 Python
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
写求职信要注意什么问题
2014/04/12 职场文书
2015年质检工作总结
2015/05/04 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
餐厅开业活动方案
2019/07/08 职场文书
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android
MySQL创建管理KEY分区
2022/04/13 MySQL
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js