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

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

 更新時間:2015年02月26日 11:25:17   投稿:junjie  
這篇文章主要介紹了python分析apache訪問日志腳本分享,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
#!/usr/bin/env python
# coding=utf-8
 
#------------------------------------------------------
# Name:     Apache 日志分析腳本
# Purpose:   此腳本只用來分析Apache的訪問日志
# Version:   2.0
# Author:    LEO
# Created:   2013-4-26
# Modified:   2013-5-4
# Copyright:  (c) LEO 2013
#------------------------------------------------------
 
import sys
import time
 
#該類是用來打印格式
class displayFormat(object):
 
  def format_size(self,size):
    '''格式化流量單位'''
    KB = 1024     
    MB = 1048576    
    GB = 1073741824  
    TB = 1099511627776
    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] + ' ApacheLogFilePath [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[-2],'bytes_sent':split_line[-1],}
    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 svm實現(xiàn)直接可用的手寫數(shù)字識別

    使用python svm實現(xiàn)直接可用的手寫數(shù)字識別

    這篇文章主要介紹了使用python svm實現(xiàn)直接可用的手寫數(shù)字識別,現(xiàn)在網(wǎng)上很多代碼是良莠不齊,真是一言難盡,于是記錄一下,能夠運行成功并識別成功的一個源碼
    2021-08-08
  • pydoc?生成Python代碼文檔實例

    pydoc?生成Python代碼文檔實例

    pydoc?是一個強大且易于使用的工具,用于生成Python代碼的文檔,通過解析代碼中的文檔字符串,?pydoc?能夠自動生成清晰、易讀的文檔,并提供一個用戶友好的界面來查看和瀏覽文檔,本文提供了一個簡單的示例
    2024-01-01
  • python如何對圖片或文件的操作

    python如何對圖片或文件的操作

    在日常編程中,我們經(jīng)常會遇到文件處理的需求,如base64與圖片的相互轉(zhuǎn)換、圖片與像素點的操作、本地文件與二進(jìn)制的互相轉(zhuǎn)換、計算文件的md5以及下載網(wǎng)絡(luò)文件等,這些操作對于處理多媒體數(shù)據(jù)、實現(xiàn)數(shù)據(jù)的持久化存儲、保證數(shù)據(jù)的完整性和安全性等方面都至關(guān)重要
    2024-09-09
  • 深入淺析python中的多進(jìn)程、多線程、協(xié)程

    深入淺析python中的多進(jìn)程、多線程、協(xié)程

    這篇文章主要介紹了深入淺析python中的多進(jìn)程、多線程、協(xié)程 的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • Python callable函數(shù)使用方法詳解

    Python callable函數(shù)使用方法詳解

    這篇文章主要介紹了Python callable函數(shù)使用方法,一個可callable的對象是指可以被調(diào)用執(zhí)行的對象,并且可以傳入?yún)?shù), 用另一個簡單的描述方式,只要可以在一個對象的后面使用小括號來執(zhí)行代碼,那么這個對象就是callable對象,下面來詳細(xì)介紹使用方法,需要的朋友可以參考下
    2024-10-10
  • Python Pandas數(shù)據(jù)分析之iloc和loc的用法詳解

    Python Pandas數(shù)據(jù)分析之iloc和loc的用法詳解

    Pandas 是一個開放源碼、BSD 許可的庫,提供高性能、易于使用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具,它是一個強大的分析結(jié)構(gòu)化數(shù)據(jù)的工具集,基礎(chǔ)是 Numpy
    2021-11-11
  • Jupyter notebook 更改文件打開的默認(rèn)路徑操作

    Jupyter notebook 更改文件打開的默認(rèn)路徑操作

    這篇文章主要介紹了Jupyter notebook 更改文件打開的默認(rèn)路徑操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • python獲取淘寶服務(wù)器時間的代碼示例

    python獲取淘寶服務(wù)器時間的代碼示例

    這篇文章主要介紹了python獲取淘寶服務(wù)器時間的代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • python中time包實例詳解

    python中time包實例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于python中time包實例詳解內(nèi)容,對此有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02
  • PyTorch?之?強大的?hub?模塊和搭建神經(jīng)網(wǎng)絡(luò)進(jìn)行氣溫預(yù)測

    PyTorch?之?強大的?hub?模塊和搭建神經(jīng)網(wǎng)絡(luò)進(jìn)行氣溫預(yù)測

    hub 模塊是調(diào)用別人訓(xùn)練好的網(wǎng)絡(luò)架構(gòu)以及訓(xùn)練好的權(quán)重參數(shù),使得自己的一行代碼就可以解決問題,方便大家進(jìn)行調(diào)用,這篇文章主要介紹了PyTorch?之?強大的?hub?模塊和搭建神經(jīng)網(wǎng)絡(luò)進(jìn)行氣溫預(yù)測,需要的朋友可以參考下
    2023-03-03

最新評論

什邡市| 藁城市| 即墨市| 陇川县| 和硕县| 宜兰县| 都江堰市| 通许县| 阿拉善右旗| 东丽区| 盐亭县| 河北区| 马公市| 肇庆市| 襄垣县| 巴彦淖尔市| 千阳县| 城口县| 华蓥市| 宜君县| 甘南县| 吉木乃县| 分宜县| 馆陶县| 杭锦旗| 麻栗坡县| 桑植县| 镇远县| 齐齐哈尔市| 东至县| 沙雅县| 和田县| 林甸县| 灌阳县| 紫金县| 怀宁县| 安平县| 久治县| 麻城市| 瑞安市| 平顶山市|