[Python/自动化运维] 运用Python进行Nginx日志状态码过滤

来源:互联网 发布:申报数据库免费吗 编辑:程序博客网 时间:2024/05/17 03:15

每个公司的NginxWeb服务器日志格式是不一样的,但是正则改一下就可以用,统计状态码及域名的发生次数,注意:注释部分为同一条url 同一个客户端ip及状态码访问过来的,生产环境这样的也不是很多,所以注释了,代码如下:

#!/usr/bin/env python# -*- coding:utf-8 -*-import reimport sysdef Return():    print('\t-c 指定状态码 (2xx 3xx 4xx 5xx)')class Match():    def __init__(self,code):        self.code = code        self.List = []    def Find(self):        for i in open('/bbd/logs/nginx_user_access.log','r').readlines():            try:            #   Ip   = re.search("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",i).group(0)                #Url  = re.search('request(.*)protocol',i).group(1).split('\"')[2]                Domain = 'http://' + re.search('domain:?(.*)request:?',i).group(1).split('\"')[2] #+ Url                Code = re.search("http_status((.*)%s+(.*))body_bytes_sent" % self.code,i).group(1).split(':')[1][1:4]                self.List.append((Domain,Code))            except Exception as e:                 pass        return self.Listclass Result():    def __init__(self):        self.data = Match(str(code)).Find()        self.Filter = []        self.Key = {}    def GetLengh(self):        for i in self.data:            if i not in  self.Key.keys():                self.Key[self.data.count(i)] =  i             else:                pass        return self.Key    def GetResult(self):        result = Result().GetLengh()        result = sorted(result.items(), key=lambda result:result[0], reverse = True)        result = result[0:11]        for k,v in result:            print('个数:%s 域名:%s ' % (k,v))if __name__ == '__main__':    try:        if sys.argv[1] == '-c':            if sys.argv[2] == '2xx':                code = '20'                value = Result()                value.GetResult()            elif sys.argv[2] == '3xx':                code = '30'                value = Result()                value.GetResult()            elif sys.argv[2] == '4xx':                code = '4'                value = Result()                value.GetResult()            elif sys.argv[2] == '5xx':                code = '5'                value = Result()                value.GetResult()        else:            Return()    except Exception as e:        Return()
原创粉丝点击