#!/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是字节
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):
'''''输出脚本执行的时间'''
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):
'''''该方法是取到各个主机信息中对应的值'''
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):
'''''计算各个状态次数、流量总量,请求的总次数,并且计算各个状态的总量 并生成一个正真的字典,方便排序'''
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) :
'''''主调函数'''
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()
相关推荐:
什么是SEO金融,seo是做什么的 ,ai中转程序
SEO和品牌营销:如何通过搜索引擎优化打造品牌影响力,建邺seo软件
ChatGPT恢复正常使用时间,提升你的工作与生活效率,联想电脑AI0510
SEO优化需要给网站做哪些优化工作?,ai捕捉火苗
SEO包含的秘密:让你的网站轻松排上首页,新媒体营销推广方案目录
seo用什么手法,seo方式 ,ai绘画飞翔
SEO优化公司一般怎么优化?揭秘专业SEO服务的操作流程,人工智能ai写作软件 哪一个好
优化标题:如何让你的文章更具吸引力与点击力,整站网站优化解决方案
ChatGPT无法加载?检查您的网络设置并尝试重启ChatGPT,助您畅享无障碍智能对话体验,ai记录人
ChatGPT无法加载?检查您的网络设置并尝试重启,轻松解决连接问题!,ai制作艺术字
优化投入,让企业更具竞争力,怎样推广营销方案
SEO深度解析:如何通过深度优化提升网站排名,带来流量和转化,咸宁网站建设大概费用
ChatGPT出问题?背后的原因与解决方案,夸克ai写作生成
ChatGPT无服务:如何突破限制,未来人工智能的新可能,ai绘制装饰画
用AI写文章会不会查重率高?破解写作困扰的真相
软件AI的全称:人工智能驱动未来的关键力量
SEO目标:让您的网站轻松登顶搜索引擎,优化购物网站的搜索
SEO优化攻略:如何通过精准策略提升网站排名与流量,aI ow翻译
目前国内最好的AI人工智能软件:未来新篇章
ChatGPT不能用了?了解这一背后的真相及解决方法,ai恐怖头像
SEO职责:为网站注入流量,提升品牌竞争力,拼多多女装关键词排名
seo适合看什么书,自学seo书籍推荐 ,ai少女 刻晴
SEO趋势:2025年搜索引擎优化的未来发展,河南省营销推广系统官网
在线AI文章生成:内容创作新革命
ChatGPT使用问题?如果您正在使用VPN,请尝试将其关闭,ai制作渐变立体
seo软文有什么作用,seo文案是什么 ,斐乐Ai测评问题
SEO任何:如何通过精准优化让网站流量突破极限,太原网站建设培训班
用AI写文章查重率高吗?揭秘AI写作与查重检测的关系
SEO努力:提升网站排名的关键策略,网站建设微企动力
AI搜索相似文章怎么做?揭秘高效文章检索的核心技术!,程式ai软件
优化原理:提升效率、创新突破的核心法则,印刷包装推广有哪里网站
SEO查:如何通过精准优化让网站流量飞速增长,吉林推广营销怎么样
ChatGPT故障:科技背后的秘密与应对策略,华为什么手机带ai功能
ChatGPT网络故障报告从协调世界时(UTC)晚上1107左右开始激增,15分钟内引发广泛关注,ai无视进化
“收录量为1”,打造数字化时代的独特竞争力,网站建设页面制作流程
“爱站”:开启网站优化与流量增长的新纪元,seo入门ppt
Bing无法使用怎么办?解决方法及替代方案推荐!,ai文字设计教程
自动写文章AI:高效创作工具,开启写作新纪元
【SEO优化全攻略】提升网站流量的终极秘籍,带你轻松玩转搜索引擎优化!,金融网站推广维护
ChatGPT打不开网页?看完这篇你就懂了!,国内ai写作安卓软件
seo网站反链是什么,网站反链怎么做 ,ai插画头像卡通
ChatGPT页面空白不乏登录:让你秒变职场高手与生活智囊,百度ai 腾讯ai
SEO关键词利器:如何借助精准关键词提升网站流量与排名,ai绘画客户
怎么看文章是不是AI生成的?揭秘背后的玄机与技巧
360优化关键词-提升网站流量与排名的秘密武器,美拍ai
ChatGDP人工智能:未来科技赋能企业与个人的智能变革,如何用AI绘制人体
SEO排位:如何通过精准策略提升网站排名,获得流量与转化,林海网络推广营销
ChatGPT无法打开?这些解决办法让你重新畅享智能对话!,北大写作ai
文章AI排版,让创作更高效的秘密武器
SEO运维:提升网站排名的核心战略,邢台网站建设优化建站