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使用saltstack生成服务器资产清单
Mar 01 Python
python操作字典类型的常用方法(推荐)
May 16 Python
python处理Excel xlrd的简单使用
Sep 12 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
Python3爬虫全国地址信息
Jan 05 Python
python实现五子棋小游戏
Mar 25 Python
Python hexstring-list-str之间的转换方法
Jun 12 Python
对Django中内置的User模型实例详解
Aug 16 Python
详解python对象之间的交互
Sep 29 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 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另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
js快速排序的实现代码
2013/12/08 Javascript
node.js中的require使用详解
2014/12/15 Javascript
JS实现图片放大镜效果的方法
2015/02/27 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
python3.4下django集成使用xadmin后台的方法
2017/08/15 Python
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
详解python读取image
2019/04/03 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
百联网上商城:i百联
2017/01/28 全球购物
园长自我鉴定
2013/10/06 职场文书
高一化学教学反思
2014/02/05 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
党小组意见范文
2015/06/08 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers