python正则分析nginx的访问日志

作者:mindg.cn 时间:2022-07-03 04:57:14 

前言

本文的脚本是分析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,nginx,日志
0
投稿

猜你喜欢

  • Django框架的中的setting.py文件说明详解

    2022-11-05 13:26:24
  • Centos7.2 编译安装PHP7.0.2的步骤

    2023-10-08 12:51:29
  • 通过asp程序来创建access数据库

    2011-04-02 11:17:00
  • Python实现网络端口转发和重定向的方法

    2023-09-23 10:19:59
  • PHP注释语法规范与命名规范详解篇

    2023-06-09 15:44:16
  • PHP中error_reporting()函数的用法(修改PHP屏蔽错误)

    2023-11-20 01:08:17
  • Python入门Anaconda和Pycharm的安装和配置详解

    2022-12-21 20:25:07
  • Go语言反射reflect.Value实现方法的调用

    2023-07-22 15:50:11
  • 基于Python实现新年倒计时

    2022-02-14 08:41:59
  • Python正则表达式re.sub()用法详解

    2022-05-29 14:30:01
  • 通过session在ASP中改善动态分页的性能

    2007-09-11 14:00:00
  • 使用PHP生成二维码的两种方法(带logo图像)

    2023-11-14 11:00:30
  • javascript 改变字体大小方法集合

    2023-07-06 16:58:02
  • python文件操作整理汇总

    2022-08-16 16:46:25
  • Oracle 8i字符集乱码问题析及其解决办法

    2010-07-26 13:29:00
  • python lambda表达式(匿名函数)写法解析

    2023-07-30 20:56:12
  • SQL Server数据库导入MySQL数据库体验

    2009-01-20 16:07:00
  • 使用豆瓣源来安装python中的第三方库方法

    2023-10-09 08:53:42
  • PHP获取类中常量,属性,及方法列表的方法

    2023-11-19 19:57:58
  • 简单介绍Python中用于求最小值的min()方法

    2021-05-27 23:00:11
  • asp之家 网络编程 m.aspxhome.com