Python日志统计
#!/usr/bin/env python# coding:utf-8import sys,timeclass DisplayFormat(object): def format_size(self,size): KB = 1024 # KB -> B 1024 MB = 1048576 # MB -> B 1024 * 1024 GB = 1073741824 # GB -> B 1024 * 1024 * 1024 TB = 1099511627776 # TB -> B 1024 * 1024 * 1024 if size >= TB: size = str(size >> 40) + 'T' elif size < KB: size = str(size) + 'B' elif size >= GB and size < TB: size = str(size >> 30) + 'G' elif size >= MB and size < GB: size = str(size >> 20) + 'M' else: size = str(size >> 10) + 'K' return size formatstring = '%-18s %-10s %-12s %8s %10s %10s %10s %10s %10s %10s %10s' def echo_line(self): '''输出头部横线''' print self.formatstring % ('-'*15,'-'*10,'-'*12,'-'*12,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,) def echo_head(self): '''输出头部信息''' print self.formatstring % ('IP','Traffic','Time','Time%',200,404,403,503,500,302,304) def echo_error(self): '''输出错误信息''' print 'Usage: ' + sys.argv[0] + 'filepath [number]' def echo_time(self): '''输出脚本执行时间''' print 'The script is running %s second' % time.clock()class HostInfo(object): # 定义一个主机ip 的所有状态列表 host_info = ['200','404','403','503','500','302','304','size','time'] def __init__(self,host): '''初始化一个主机信息字典''' self.host = host = {}.fromkeys(self.host_info,0) def add_1(self,status_size,is_size): '''对访问次数,http返回的状态码,ip流量进行加1操作''' if status_size == 'time': self.host['time'] += 1 elif is_size: self.host['size'] = self.host['size'] + status_size else: self.host[status_size] += 1 def get_value(self,value): '''取出字典的值''' return self.host[value]class AnalysisFile(object): def __init__(self): '''初始化一个空字典''' self.empty = {} self.total_request_time,self.total_traffic,self.total_200,\ self.total_404,self.total_403,self.total_503,self.total_500,\ self.total_302,self.total_304 = 0,0,0,0,0,0,0,0,0 def split_line_todict(self,line): '''传入文件的每一行取出0、8、9字段 生成字典 并返回这个字典''' line_split = line.split() line_dict = {'remote_host':line_split[0],'status':line_split[8],'bytes_sent':line_split[9]} return line_dict def read_log(self,logs): for line in logs: try: dict_line = self.split_line_todict(line) host = dict_line['remote_host'] status = dict_line['status'] except ValueError: continue except IndexError: continue if host not in self.empty: host_info_obj = HostInfo(host) self.empty[host] = host_info_obj else: host_info_obj = self.empty[host] host_info_obj.add_1('time',False) if status in host_info_obj.host_info: host_info_obj.add_1(status,False) try: bytes_sent = int(dict_line['bytes_sent']) except ValueError: bytes_sent = 0 host_info_obj.add_1(bytes_sent,True) return self.empty def return_sorted_list(self,true_dict): '''循环读取字典,计算总的流量、总的访问次数以及总的http返回码''' for host_key in true_dict: host_value = true_dict[host_key] time = host_value.get_value('time') self.total_request_time = self.total_request_time + time size = host_value.get_value('size') self.total_traffic = self.total_traffic + size # 获取http返回状态码的次数 v_200 = host_value.get_value('200') v_404 = host_value.get_value('404') v_403 = host_value.get_value('403') v_503 = host_value.get_value('503') v_500 = host_value.get_value('500') v_302 = host_value.get_value('302') v_304 = host_value.get_value('304') # 重新规划字典 true_dict[host_key] = {'200':v_200,'404':v_404,'403':v_403,\ '503':v_503,'500':v_500,'302':v_302,\ '304':v_304,'size':size,'time':time} # 计算http返回状态码的总量 self.total_200 = self.total_200 + v_200 self.total_404 = self.total_404 + v_404 self.total_403 = self.total_403 + v_403 self.total_503 = self.total_503 + v_503 self.total_500 = self.total_500 + v_500 self.total_302 = self.total_302 + v_302 self.total_304 = self.total_304 + v_304 # 对总的访问次数和访问流量进行降序排序,并生成一个有序的列表 sorted_list = sorted(true_dict.items(),key=lambda i:(i[1]['size'],\ i[1]['time']),reverse=True) return sorted_listclass Main(object): def main(self): '''主调函数''' # 初始化DisplayFormat类的实例 displayformat = DisplayFormat() args = len(sys.argv) if args == 1: displayformat.echo_error() elif args == 2 or args == 3: log_file = sys.argv[1] try: files = open(log_file,'r') if args == 3: lines = int(sys.argv[2]) else: lines = 0 except IOError,e: print print e displayformat.echo_error() except VaueError,e: print print e displayformat.echo_error() else: displayformat.echo_error() #AnalysisFile类的实例化 fileanalysis = AnalysisFile() # 调用read_log方法 news_dict = fileanalysis.read_log(files) # 调用return_sorted_list方法 new_list = fileanalysis.return_sorted_list(news_dict) # 计算所有ip的总量 total_ip = len(new_list) if lines: new_list = new_list[0:lines] files.close() # 打印出总的ip数,总访问流量,总的访问次数 print total_request_time = fileanalysis.total_request_time total_traffic = displayformat.format_size(fileanalysis.total_traffic) print '总IP数量: %s 总的访问流量: %s 总的请求次数: %d' % (total_ip,\ total_traffic,\ total_request_time) # 打印头部信息,和横线 print displayformat.echo_head() displayformat.echo_line() # 循环读取news_list列表取出time项目 计算time百分比 通过displayformat格式化输出主机信息 for i in new_list: time = i[1]['time'] time_percentage = (float(time) / float(fileanalysis.total_request_time)) * 100 print displayformat.formatstring % (i[0],\ displayformat.format_size(i[1]['size']),\ time,str(time_percentage)[0:5],\ i[1]['200'],i[1]['404'],i[1]['403'],\ i[1]['503'],i[1]['500'],i[1]['302'],i[1]['304']) if not lines or total_ip == lines: displayformat.echo_line() print displayformat.formatstring % (total_ip,total_traffic,total_request_time,'100%',\ fileanalysis.total_200,fileanalysis.total_404,\ fileanalysis.total_403,fileanalysis.total_503,\ fileanalysis.total_500,fileanalysis.total_302,\ fileanalysis.total_304) # 显示执行脚本的时间 print displayformat.echo_time()if __name__ == '__main__': main = Main() main.main()Python日志统计的更多相关文章
- Kafka实战-实时日志统计流程
1.概述 在<Kafka实战-简单示例>一文中给大家介绍来Kafka的简单示例,演示了如何编写Kafka的代码去生产数据和消费数据,今天给大家介绍如何去整合一个完整的项目,本篇博客我打算为 ...
- Node.js / Python 日志
一.Node.js 日志 1.原生 Node.js 原生方法其实很简单,就四个: // 输出到 stdout console.log() console.info() = console.log() ...
- python数据统计,总数,平均值等
一般我们进行数据统计的时候要进行数据摸查,可能是摸查整体的分布情况啊.平均值,标准差,总数,各分段的人数啊.这时候用excel或者数据库统计都不方便. 我要统计的一个文件,太大了,还得分成15个文件, ...
- Python日志输出——logging模块
Python日志输出——logging模块 标签: loggingpythonimportmodulelog4j 2012-03-06 00:18 31605人阅读 评论(8) 收藏 举报 分类: P ...
- python日志模块logging
python日志模块logging 1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...
- 蓝桥杯c/c++省赛真题——日志统计
标题:日志统计 [问题描述]小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是:ts id 表示在ts时刻编号id的帖子收到一个" ...
- 浅析python日志重复输出问题
浅析python日志重复输出问题 问题起源: 在学习了python的函数式编程后,又接触到了logging这样一个强大的日志模块.为了减少重复代码,应该不少同学和我一样便迫不及待的写了一个自己的日 ...
- Python代码统计工具
目录 Python代码统计工具 声明 一. 问题提出 二. 代码实现 三. 效果验证 Python代码统计工具 标签: Python 代码统计 声明 本文将对<Python实现C代码统计工具(一 ...
- 日志统计 尺取法【蓝桥杯2018 C/C++ B组】
标题:日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞" ...
随机推荐
- 自制Javascript浮动广告
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb ...
- SQL 根据IF判断,SET字段值
当INVOICE_STATUS值为1时,赋值为2,否者赋值为原来的值 UPDATE T_INVOICE SET DOWNLOAD_COUNT = DOWNLOAD_COUNT + 1, INVOICE ...
- Linux Shell编程 test命令
概述 test 命令是Shell 脚本中用来进行条件判断的. test命令示例 按照文件类型进行判断 测试选项 作 用 -b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真) -c ...
- 虚构 css 父级选择器
能 CSS 解决的绝不用 JS,这句话又一次故作装逼地说出来还是挺爽的... 比如下拉列表,能用 CSS 的 :focus 就不用 JS 的 .on("focus blur") 能 ...
- 写给后端程序员的HTTP缓存原理介绍--怎样决定一个资源的Cache-Control策略呢
通过Internet获取资源既缓慢,成本又高.为此,Http协议里包含了控制缓存的部分,以使Http客户端可以缓存和重用以前获 取的资源,从而优化性能,提升体验.虽然Http中关于缓存控制的部分,随着 ...
- 非root权限的linux用法添加工作路径
修改~目录的bashrc文件: 1.cd 到~目录. 2.ls -a ,bashrc文件是隐藏的. 3.vim .bashrc;export PATH=$PAHT:要添加的工作路径. 4.source ...
- JVM内存的堆、栈和方法区
JVM的内存分为堆.栈.方法区和程序计数器4个区域 存储内容:基本类型,对象引用,对象本身,class,常量,static变量 堆: 拥有者:所有线程 内容:对象本身,不存放基本类型和对象引用 垃圾回 ...
- Qt开发UDP
一.单播 1.声明udp对象 QUdpSocket* udpClient: 2.new出对象 udpClient = new QUdpSocket(this); 3.分配本地地址(如果不分配,使用系统 ...
- INSPIRED启示录 读书笔记 - 第27章 合理运用瀑布式开发方法
瀑布式开发方法的基本原则 1.采用阶段式开发:软件开发过程被事先分成固定的几个阶段,撰写书面的需求说明文档.设计高层软件架构.设计低层细节.编写代码.测试.部署 2.采用阶段式评审:每个阶段结束后,对 ...
- 如何用hexo+github搭建个人博客
搭建环境 1.安装 Node.js: https://nodejs.org/en/ windows下点击链接,下载安装即可;Linux下更加简单,在终端下输入sudo apt-get install ...