最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python分析nignx訪問日志腳本分享

 更新時間:2015年02月26日 11:27:29   投稿:junjie  
這篇文章主要介紹了python分析nignx訪問日志腳本分享,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
#!/usr/bin/env python 
# coding=utf-8 
 
#------------------------------------------------------ 
# Name:     nginx 日志分析腳本 
# Purpose:   此腳本只用來分析nginx的訪問日志 
# Version:   1.0 
# Author:    LEO 
# Created:   2013-05-07 
# Modified:   2013-05-07 
# Copyright:  (c) LEO 2013 
#------------------------------------------------------ 
 
import sys 
import time 
 
#該類是用來打印格式 
class displayFormat(object): 
 
  def format_size(self,size): 
    '''''格式化流量單位''' 
    KB = 1024      #KB -> B B是字節(jié) 
    MB = 1048576    #MB -> B 
    GB = 1073741824   #GB -> B 
    TB = 1099511627776 #TB -> B 
    if size >= TB : 
      size = str(size / TB) + 'T' 
    elif size < KB : 
      size = str(size) + 'B' 
    elif size >= GB and size < TB: 
      size = str(size / GB) + 'G' 
    elif size >= MB and size < GB : 
      size = str(size / MB) + 'M' 
    else : 
      size = str(size / KB) + 'K' 
    return size 
 
  #定義字符串格式化 
  formatstring = '%-15s %-10s %-12s %8s %10s %10s %10s %10s %10s %10s %10s' 
 
  def transverse_line(self) : 
    '''''輸出橫線''' 
    print self.formatstring % ('-'*15,'-'*10,'-'*12,'-'*12,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10) 
 
  def head(self): 
    '''''輸出頭部信息''' 
    print self.formatstring % ('IP','Traffic','Times','Times%','200','404','500','403','302','304','503') 
 
  def error_print(self) : 
    '''''輸出錯誤信息''' 
    print 
    print 'Usage : ' + sys.argv[0] + ' NginxLogFilePath [Number]' 
    print 
    sys.exit(1) 
 
  def execut_time(self): 
    '''''輸出腳本執(zhí)行的時間''' 
    print 
    print "Script Execution Time: %.3f second" % time.clock() 
    print 
 
#該類是用來生成主機信息的字典 
class hostInfo(object): 
  host_info = ['200','404','500','302','304','503','403','times','size'] 
 
  def __init__(self,host): 
    self.host = host = {}.fromkeys(self.host_info,0) 
 
  def increment(self,status_times_size,is_size): 
    '''''該方法是用來給host_info中的各個值加1''' 
    if status_times_size == 'times': 
      self.host['times'] += 1 
    elif is_size: 
      self.host['size'] = self.host['size'] + status_times_size 
    else: 
      self.host[status_times_size] += 1 
 
  def get_value(self,value): 
    '''''該方法是取到各個主機信息中對應(yīng)的值''' 
    return self.host[value] 
 
#該類是用來分析文件 
class fileAnalysis(object): 
  def __init__(self): 
    '''''初始化一個空字典''' 
    self.report_dict = {} 
    self.total_request_times,self.total_traffic,self.total_200, 
    self.total_404,self.total_500,self.total_403,self.total_302, 
    self.total_304,self.total_503 = 0,0,0,0,0,0,0,0,0 
 
  def split_eachline_todict(self,line): 
    '''''分割文件中的每一行,并返回一個字典''' 
    split_line = line.split() 
    split_dict = {'remote_host':split_line[0],'status':split_line[8], 
           'bytes_sent':split_line[9],} 
    return split_dict 
 
  def generate_log_report(self,logfile): 
    '''''讀取文件,分析split_eachline_todict方法生成的字典''' 
    for line in logfile: 
      try: 
        line_dict = self.split_eachline_todict(line) 
        host = line_dict['remote_host'] 
        status = line_dict['status'] 
      except ValueError : 
        continue 
      except IndexError : 
        continue 
 
      if host not in self.report_dict : 
        host_info_obj = hostInfo(host) 
        self.report_dict[host] = host_info_obj 
      else : 
        host_info_obj = self.report_dict[host] 
 
      host_info_obj.increment('times',False) 
      if status in host_info_obj.host_info : 
        host_info_obj.increment(status,False) 
      try: 
        bytes_sent = int(line_dict['bytes_sent']) 
      except ValueError: 
        bytes_sent = 0 
      host_info_obj.increment(bytes_sent,True) 
    return self.report_dict 
 
  def return_sorted_list(self,true_dict): 
    '''''計算各個狀態(tài)次數(shù)、流量總量,請求的總次數(shù),并且計算各個狀態(tài)的總量 并生成一個正真的字典,方便排序''' 
    for host_key in true_dict : 
      host_value = true_dict[host_key] 
      times = host_value.get_value('times')            
      self.total_request_times = self.total_request_times + times 
      size = host_value.get_value('size')            
      self.total_traffic = self.total_traffic + size  
 
      o200 = host_value.get_value('200') 
      o404 = host_value.get_value('404') 
      o500 = host_value.get_value('500') 
      o403 = host_value.get_value('403') 
      o302 = host_value.get_value('302') 
      o304 = host_value.get_value('304') 
      o503 = host_value.get_value('503') 
 
      true_dict[host_key] = {'200':o200,'404':o404,'500':o500, 
                  '403':o403,'302':o302,'304':o304, 
                  '503':o503,'times':times,'size':size} 
 
      self.total_200 = self.total_200 + o200 
      self.total_404 = self.total_404 + o404 
      self.total_500 = self.total_500 + o500 
      self.total_302 = self.total_302 + o302 
      self.total_304 = self.total_304 + o304 
      self.total_503 = self.total_503 + o503 
 
    sorted_list = sorted(true_dict.items(),key=lambda t:(t[1]['times'],
                               t[1]['size']),reverse=True) 
 
    return sorted_list 
 
class Main(object): 
  def main(self) : 
    '''''主調(diào)函數(shù)''' 
    display_format = displayFormat() 
    arg_length = len(sys.argv) 
    if arg_length == 1 : 
      display_format.error_print() 
    elif arg_length == 2 or arg_length == 3: 
      infile_name = sys.argv[1] 
      try : 
        infile = open(infile_name,'r') 
        if arg_length == 3 : 
          lines = int(sys.argv[2]) 
        else : 
          lines = 0 
      except IOError,e : 
        print 
        print e 
        display_format.error_print() 
      except ValueError : 
        print 
        print "Please Enter A Volid Number !!" 
        display_format.error_print() 
    else : 
      display_format.error_print() 
 
    fileAnalysis_obj = fileAnalysis() 
    not_true_dict = fileAnalysis_obj.generate_log_report(infile) 
    log_report = fileAnalysis_obj.return_sorted_list(not_true_dict) 
    total_ip = len(log_report) 
    if lines : 
      log_report = log_report[0:lines] 
    infile.close() 
 
    print 
    total_traffic = display_format.format_size(fileAnalysis_obj.total_traffic) 
    total_request_times = fileAnalysis_obj.total_request_times 
    print 'Total IP: %s  Total Traffic: %s  Total Request Times: %d' 
       % (total_ip,total_traffic,total_request_times) 
    print 
    display_format.head() 
    display_format.transverse_line() 
 
    for host in log_report : 
      times = host[1]['times'] 
      times_percent = (float(times) / float(fileAnalysis_obj.total_request_times)) * 100 
      print display_format.formatstring % (host[0],
                         display_format.format_size(host[1]['size']),
                         times,str(times_percent)[0:5],
                         host[1]['200'],host[1]['404'],
                         host[1]['500'],host[1]['403'],
                         host[1]['302'],host[1]['304'],host[1]['503']) 
                         
    if (not lines) or total_ip == lines : 
      display_format.transverse_line() 
      print display_format.formatstring % (total_ip,total_traffic, 
                         total_request_times,'100%',
                         fileAnalysis_obj.total_200,
                         fileAnalysis_obj.total_404,
                         fileAnalysis_obj.total_500, 
                         fileAnalysis_obj.total_403,
                         fileAnalysis_obj.total_302, 
                         fileAnalysis_obj.total_304,
                         fileAnalysis_obj.total_503) 
 
    display_format.execut_time() 
 
if __name__ == '__main__': 
  main_obj = Main() 
  main_obj.main()

相關(guān)文章

  • 詳解python配置虛擬環(huán)境

    詳解python配置虛擬環(huán)境

    這篇文章主要介紹了python配置虛擬環(huán)境,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Python連接es之es更新操作示例詳解

    Python連接es之es更新操作示例詳解

    這篇文章主要為大家介紹了Python連接es之es更新操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Python實現(xiàn)批量解壓文件夾下所有壓縮包

    Python實現(xiàn)批量解壓文件夾下所有壓縮包

    這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)批量解壓文件夾下所有壓縮包,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • 全面解讀Python Web開發(fā)框架Django

    全面解讀Python Web開發(fā)框架Django

    Django是一個開源的Web應(yīng)用框架,由Python寫成。采用MVC的軟件設(shè)計模式,主要目標(biāo)是使得開發(fā)復(fù)雜的、數(shù)據(jù)庫驅(qū)動的網(wǎng)站變得簡單。Django注重組件的重用性和“可插拔性”,敏捷開發(fā)和DRY法則(Don’t Repeat Yoursef)。
    2014-06-06
  • TensorFLow 變量命名空間實例

    TensorFLow 變量命名空間實例

    今天小編就為大家分享一篇TensorFLow 變量命名空間實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python數(shù)據(jù)類型詳解(四)字典:dict

    Python數(shù)據(jù)類型詳解(四)字典:dict

    本文給大家分享的知識是Python數(shù)據(jù)類型中的字典(dict)的基本概念,常用操作以及示例,非常的實用,對于大家理解字典dict非常有幫助,希望大家能夠喜歡
    2016-05-05
  • python如何把嵌套列表轉(zhuǎn)變成普通列表

    python如何把嵌套列表轉(zhuǎn)變成普通列表

    這篇文章主要為大家詳細介紹了python如何把嵌套列表轉(zhuǎn)變成普通列表,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 深入理解Python 多線程

    深入理解Python 多線程

    這篇文章主要介紹了Python 多線程的相關(guān)知識,文中講解的非常詳細,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Python代碼部署的三種加密方案

    Python代碼部署的三種加密方案

    本文主要介紹了Python代碼部署的三種加密方案,主要介紹了代碼混淆、代碼編譯、代碼打包這三種,具有一定的參考價值,感興趣的可以了解一下
    2023-02-02
  • 如何用python做簡單的接口壓力測試

    如何用python做簡單的接口壓力測試

    這篇文章主要介紹了如何用python做簡單的接口壓力測試問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

友谊县| 沈阳市| 建德市| 岫岩| 东港市| 石景山区| 泸州市| 海林市| 瓮安县| 志丹县| 乐山市| 淮安市| 大厂| 梁平县| 宕昌县| 澄江县| 旺苍县| 宁德市| 广西| 延长县| 山东| 喜德县| 江永县| 磴口县| 鲁山县| 九龙城区| 太和县| 宜章县| 兰州市| 鹤壁市| 武强县| 松阳县| 剑川县| 中卫市| 山西省| 保山市| 黑河市| 安多县| 临江市| 紫阳县| 木兰县|