ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

python分析nginx日志

2021-03-08 21:54:13  阅读:219  来源: 互联网

标签:python parser list nginx url urls 日志 logfile


上周咳嗽比较厉害,暂停了一周更新,收到很多小伙伴的留言,真是非常感动,非常感谢大家关心和支持,现在吃了几天药,基本好的差不多了,这周咱们接着谈python在运维中的技术实践,今天的脚本是分析nginx的访问日志, 主要为了检查站点uri的访问次数,检查的结果会提供给研发人员做参考,因为谈到分析嘛,那肯定要用到正则表达式了,所以请没有接触过正则的小伙伴自行补脑,因为涉及正则的知识点过于庞大,所以一篇两篇是根本不能写清楚的,我就不展开写了,开始前,我们先看看要分析的日志结构:


127.0.0.1 - - [19/Jun/2016: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/2016: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()函数功能是分析日志,返回匹配的行列表,正则部分就不解释了,可以看注释,re.findall()可以获取字符串中所有匹配的字符串;    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/1606/758536.html', 141), ('http://domain.com/?q=node&page=12', 3), ('http://website.net/htm_data/7/1606/758536.html', 1)]


标签:python,parser,list,nginx,url,urls,日志,logfile
来源: https://blog.51cto.com/15060540/2651674

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有