python分析apache訪問(wèn)日志腳本分享
更新時(shí)間:2015年02月26日 11:25:17 投稿:junjie
這篇文章主要介紹了python分析apache訪問(wèn)日志腳本分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
#!/usr/bin/env python
# coding=utf-8
#------------------------------------------------------
# Name: Apache 日志分析腳本
# Purpose: 此腳本只用來(lái)分析Apache的訪問(wèn)日志
# Version: 2.0
# Author: LEO
# Created: 2013-4-26
# Modified: 2013-5-4
# Copyright: (c) LEO 2013
#------------------------------------------------------
import sys
import time
#該類(lèi)是用來(lái)打印格式
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) :
'''輸出橫線(xiàn)'''
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) :
'''輸出錯(cuò)誤信息'''
print
print 'Usage : ' + sys.argv[0] + ' ApacheLogFilePath [Number]'
print
sys.exit(1)
def execut_time(self):
'''輸出腳本執(zhí)行的時(shí)間'''
print
print "Script Execution Time: %.3f second" % time.clock()
print
#該類(lèi)是用來(lái)生成主機(jī)信息的字典
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):
'''該方法是用來(lái)給host_info中的各個(gè)值加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):
'''該方法是取到各個(gè)主機(jī)信息中對(duì)應(yīng)的值'''
return self.host[value]
#該類(lèi)是用來(lái)分析文件
class fileAnalysis(object):
def __init__(self):
'''初始化一個(gè)空字典'''
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):
'''分割文件中的每一行,并返回一個(gè)字典'''
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):
'''計(jì)算各個(gè)狀態(tài)次數(shù)、流量總量,請(qǐng)求的總次數(shù),并且計(jì)算各個(gè)狀態(tài)的總量 并生成一個(gè)正真的字典,方便排序'''
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()
您可能感興趣的文章:
- python實(shí)時(shí)分析日志的一個(gè)小腳本分享
- Python 分析Nginx訪問(wèn)日志并保存到MySQL數(shù)據(jù)庫(kù)實(shí)例
- 使用python分析git log日志示例
- python實(shí)現(xiàn)分析apache和nginx日志文件并輸出訪客ip列表的方法
- python寫(xiě)的一個(gè)squid訪問(wèn)日志分析的小程序
- 利用python分析access日志的方法
- python正則分析nginx的訪問(wèn)日志
- python+pandas分析nginx日志的實(shí)例
- python分塊讀取大數(shù)據(jù),避免內(nèi)存不足的方法
- Python實(shí)現(xiàn)的大數(shù)據(jù)分析操作系統(tǒng)日志功能示例
相關(guān)文章
python隊(duì)列原理及實(shí)現(xiàn)方法示例
這篇文章主要介紹了python隊(duì)列原理及實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Python隊(duì)列的概念、原理、定義及基本操作技巧,需要的朋友可以參考下2019-11-11
Python3如何根據(jù)函數(shù)名動(dòng)態(tài)調(diào)用函數(shù)
這篇文章主要介紹了Python3如何根據(jù)函數(shù)名動(dòng)態(tài)調(diào)用函數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
利用Tkinter和matplotlib兩種方式畫(huà)餅狀圖的實(shí)例
下面小編就為大家?guī)?lái)一篇利用Tkinter和matplotlib兩種方式畫(huà)餅狀圖的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望對(duì)大家有所幫助2017-11-11
完美解決python中ndarray 默認(rèn)用科學(xué)計(jì)數(shù)法顯示的問(wèn)題
今天小編就為大家分享一篇完美解決python中ndarray 默認(rèn)用科學(xué)計(jì)數(shù)法顯示的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Python學(xué)習(xí)_幾種存取xls/xlsx文件的方法總結(jié)
今天小編就為大家分享一篇Python學(xué)習(xí)_幾種存取xls/xlsx文件的方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
使用python語(yǔ)言,比較兩個(gè)字符串是否相同的實(shí)例
今天小編就為大家分享一篇使用python語(yǔ)言,比較兩個(gè)字符串是否相同的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Python給exe添加以管理員運(yùn)行的屬性方法詳解
這篇文章主要為大家介紹了Python給exe添加以管理員運(yùn)行的屬性方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

