服务器之家

服务器之家 > 正文

python分析nignx访问日志脚本分享

时间:2019-11-21 14:35     来源/作者:python教程网
  1. #!/usr/bin/env python  
  2. # coding=utf-8  
  3.    
  4. #------------------------------------------------------  
  5. # Name:     nginx 日志分析脚本  
  6. # Purpose:   此脚本只用来分析nginx的访问日志  
  7. # Version:   1.0  
  8. # Author:    LEO  
  9. # Created:   2013-05-07  
  10. # Modified:   2013-05-07  
  11. # Copyright:  (c) LEO 2013  
  12. #------------------------------------------------------  
  13.    
  14. import sys  
  15. import time  
  16.    
  17. #该类是用来打印格式  
  18. class displayFormat(object):  
  19.    
  20.   def format_size(self,size):  
  21.     '''''格式化流量单位''' 
  22.     KB = 1024      #KB -> B B是字节  
  23.     MB = 1048576    #MB -> B  
  24.     GB = 1073741824   #GB -> B  
  25.     TB = 1099511627776 #TB -> B  
  26.     if size >= TB :  
  27.       size = str(size / TB) + 'T' 
  28.     elif size < KB :  
  29.       size = str(size) + 'B' 
  30.     elif size >= GB and size < TB:  
  31.       size = str(size / GB) + 'G' 
  32.     elif size >= MB and size < GB :  
  33.       size = str(size / MB) + 'M' 
  34.     else :  
  35.       size = str(size / KB) + 'K' 
  36.     return size  
  37.    
  38.   #定义字符串格式化  
  39.   formatstring = '%-15s %-10s %-12s %8s %10s %10s %10s %10s %10s %10s %10s' 
  40.    
  41.   def transverse_line(self) :  
  42.     '''''输出横线''' 
  43.     print self.formatstring % ('-'*15,'-'*10,'-'*12,'-'*12,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10)  
  44.    
  45.   def head(self):  
  46.     '''''输出头部信息''' 
  47.     print self.formatstring % ('IP','Traffic','Times','Times%','200','404','500','403','302','304','503')  
  48.    
  49.   def error_print(self) :  
  50.     '''''输出错误信息''' 
  51.     print 
  52.     print 'Usage : ' + sys.argv[0] + ' NginxLogFilePath [Number]' 
  53.     print 
  54.     sys.exit(1)  
  55.    
  56.   def execut_time(self):  
  57.     '''''输出脚本执行的时间''' 
  58.     print 
  59.     print "Script Execution Time: %.3f second" % time.clock()  
  60.     print 
  61.    
  62. #该类是用来生成主机信息的字典  
  63. class hostInfo(object):  
  64.   host_info = ['200','404','500','302','304','503','403','times','size']  
  65.    
  66.   def __init__(self,host):  
  67.     self.host = host = {}.fromkeys(self.host_info,0)  
  68.    
  69.   def increment(self,status_times_size,is_size):  
  70.     '''''该方法是用来给host_info中的各个值加1''' 
  71.     if status_times_size == 'times':  
  72.       self.host['times'] += 1 
  73.     elif is_size:  
  74.       self.host['size'] = self.host['size'] + status_times_size  
  75.     else:  
  76.       self.host[status_times_size] += 1 
  77.    
  78.   def get_value(self,value):  
  79.     '''''该方法是取到各个主机信息中对应的值''' 
  80.     return self.host[value]  
  81.    
  82. #该类是用来分析文件  
  83. class fileAnalysis(object):  
  84.   def __init__(self):  
  85.     '''''初始化一个空字典''' 
  86.     self.report_dict = {}  
  87.     self.total_request_times,self.total_traffic,self.total_200,  
  88.     self.total_404,self.total_500,self.total_403,self.total_302,  
  89.     self.total_304,self.total_503 = 0,0,0,0,0,0,0,0,0 
  90.    
  91.   def split_eachline_todict(self,line):  
  92.     '''''分割文件中的每一行,并返回一个字典''' 
  93.     split_line = line.split()  
  94.     split_dict = {'remote_host':split_line[0],'status':split_line[8],  
  95.            'bytes_sent':split_line[9],}  
  96.     return split_dict  
  97.    
  98.   def generate_log_report(self,logfile):  
  99.     '''''读取文件,分析split_eachline_todict方法生成的字典''' 
  100.     for line in logfile:  
  101.       try:  
  102.         line_dict = self.split_eachline_todict(line)  
  103.         host = line_dict['remote_host']  
  104.         status = line_dict['status']  
  105.       except ValueError :  
  106.         continue 
  107.       except IndexError :  
  108.         continue 
  109.    
  110.       if host not in self.report_dict :  
  111.         host_info_obj = hostInfo(host)  
  112.         self.report_dict[host] = host_info_obj  
  113.       else :  
  114.         host_info_obj = self.report_dict[host]  
  115.    
  116.       host_info_obj.increment('times',False)  
  117.       if status in host_info_obj.host_info :  
  118.         host_info_obj.increment(status,False)  
  119.       try:  
  120.         bytes_sent = int(line_dict['bytes_sent'])  
  121.       except ValueError:  
  122.         bytes_sent = 0 
  123.       host_info_obj.increment(bytes_sent,True)  
  124.     return self.report_dict  
  125.    
  126.   def return_sorted_list(self,true_dict):  
  127.     '''''计算各个状态次数、流量总量,请求的总次数,并且计算各个状态的总量 并生成一个正真的字典,方便排序''' 
  128.     for host_key in true_dict :  
  129.       host_value = true_dict[host_key]  
  130.       times = host_value.get_value('times')             
  131.       self.total_request_times = self.total_request_times + times  
  132.       size = host_value.get_value('size')             
  133.       self.total_traffic = self.total_traffic + size   
  134.    
  135.       o200 = host_value.get_value('200')  
  136.       o404 = host_value.get_value('404')  
  137.       o500 = host_value.get_value('500')  
  138.       o403 = host_value.get_value('403')  
  139.       o302 = host_value.get_value('302')  
  140.       o304 = host_value.get_value('304')  
  141.       o503 = host_value.get_value('503')  
  142.    
  143.       true_dict[host_key] = {'200':o200,'404':o404,'500':o500,  
  144.                   '403':o403,'302':o302,'304':o304,  
  145.                   '503':o503,'times':times,'size':size}  
  146.    
  147.       self.total_200 = self.total_200 + o200  
  148.       self.total_404 = self.total_404 + o404  
  149.       self.total_500 = self.total_500 + o500  
  150.       self.total_302 = self.total_302 + o302  
  151.       self.total_304 = self.total_304 + o304  
  152.       self.total_503 = self.total_503 + o503  
  153.    
  154.     sorted_list = sorted(true_dict.items(),key=lambda t:(t[1]['times'], 
  155.                                t[1]['size']),reverse=True)  
  156.    
  157.     return sorted_list  
  158.    
  159. class Main(object):  
  160.   def main(self) :  
  161.     '''''主调函数''' 
  162.     display_format = displayFormat()  
  163.     arg_length = len(sys.argv)  
  164.     if arg_length == 1 :  
  165.       display_format.error_print()  
  166.     elif arg_length == 2 or arg_length == 3:  
  167.       infile_name = sys.argv[1]  
  168.       try :  
  169.         infile = open(infile_name,'r')  
  170.         if arg_length == 3 :  
  171.           lines = int(sys.argv[2])  
  172.         else :  
  173.           lines = 0 
  174.       except IOError,e :  
  175.         print 
  176.         print e  
  177.         display_format.error_print()  
  178.       except ValueError :  
  179.         print 
  180.         print "Please Enter A Volid Number !!" 
  181.         display_format.error_print()  
  182.     else :  
  183.       display_format.error_print()  
  184.    
  185.     fileAnalysis_obj = fileAnalysis()  
  186.     not_true_dict = fileAnalysis_obj.generate_log_report(infile)  
  187.     log_report = fileAnalysis_obj.return_sorted_list(not_true_dict)  
  188.     total_ip = len(log_report)  
  189.     if lines :  
  190.       log_report = log_report[0:lines]  
  191.     infile.close()  
  192.    
  193.     print 
  194.     total_traffic = display_format.format_size(fileAnalysis_obj.total_traffic)  
  195.     total_request_times = fileAnalysis_obj.total_request_times  
  196.     print 'Total IP: %s  Total Traffic: %s  Total Request Times: %d' 
  197.        % (total_ip,total_traffic,total_request_times)  
  198.     print 
  199.     display_format.head()  
  200.     display_format.transverse_line()  
  201.    
  202.     for host in log_report :  
  203.       times = host[1]['times']  
  204.       times_percent = (float(times) / float(fileAnalysis_obj.total_request_times)) * 100 
  205.       print display_format.formatstring % (host[0], 
  206.                          display_format.format_size(host[1]['size']), 
  207.                          times,str(times_percent)[0:5], 
  208.                          host[1]['200'],host[1]['404'], 
  209.                          host[1]['500'],host[1]['403'], 
  210.                          host[1]['302'],host[1]['304'],host[1]['503'])  
  211.                            
  212.     if (not lines) or total_ip == lines :  
  213.       display_format.transverse_line()  
  214.       print display_format.formatstring % (total_ip,total_traffic,  
  215.                          total_request_times,'100%'
  216.                          fileAnalysis_obj.total_200, 
  217.                          fileAnalysis_obj.total_404, 
  218.                          fileAnalysis_obj.total_500,  
  219.                          fileAnalysis_obj.total_403, 
  220.                          fileAnalysis_obj.total_302,  
  221.                          fileAnalysis_obj.total_304, 
  222.                          fileAnalysis_obj.total_503)  
  223.    
  224.     display_format.execut_time()  
  225.    
  226. if __name__ == '__main__':  
  227.   main_obj = Main()  
  228.   main_obj.main() 
标签:

相关文章

热门资讯

2022年最旺的微信头像大全 微信头像2022年最新版图片
2022年最旺的微信头像大全 微信头像2022年最新版图片 2022-01-10
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
暖暖日本高清免费中文 暖暖在线观看免费完整版韩国
暖暖日本高清免费中文 暖暖在线观看免费完整版韩国 2021-05-08
返回顶部