Python日志统计
#!/usr/bin/env python
# coding:utf-8
import
sys,time
class
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_list
class
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的帖子收到一个"赞" ...
随机推荐
- requirejs神奇问题,data-main修改后,刷新没有重新载入
同事在使用require的时候,在配置地方增加 urlArgs: "bust=" + (new Date()).getTime(), 然后问题又来了,这个相当于js版本的东东会把 ...
- tar软件安装
安装tar ./configure make sudo make install
- 前端之 JQuery
一.基本选择器 1.#id 概述: 根据给定的ID匹配一个元素. 使用任何的元字符(如 !"#$%&'()*+,./:;<=>?@[\]^`{|}~)作为名称的文本部分, ...
- window端口号被占用解决
1. 找到占用该端口的pid netstat -ano|findstr "端口号" 2. 强制关闭该占用该端口的进程 // 关闭 taskkill -pid 刚才查的pid // ...
- Ubuntu16.04下编译android6.0源码
http://blog.csdn.net/cnliwy/article/details/52189349 作为一名合格的android开发人员,怎么能不会编译android源码呢!一定要来一次说编译就 ...
- Android 平台电容式触摸屏的驱动基本原理
Android 平台电容式触摸屏的驱动基本原理 Android 平台电容式触摸屏硬件基本原理 Linux 与 Android 的多点触摸协议 Linux输入子系统:事件的编码
- 登陆weblogic后页面控制台卡主
输入http://localhost:7001/console进入控制页面,能登陆进去,但是登陆进去后页面就马上卡死,可以看到页面头部,其余都显示不出来. 重启后启动访问,能够正常进入,关闭weblo ...
- awk的逻辑运算符
运算符 描述 赋值运算符 = += -= *= /= %= ^= **= 赋值语句 逻辑运算符 || 逻辑或 && 逻辑与 正则运算符 ~ ~! 匹配正则表达式和不匹配正则表达式 关系 ...
- 理解$watch、$apply与$digest
Angular环境 浏览器里面有一个事件队列(event queue),用户触发啥事儿,或者网络请求,延时操作(例如定时器之类),都是一个event,浏览器会轮询这些事件,然后调用这些回调(这里的回调 ...
- 数独C语言算法
备好:http://blog.chinaunix.net/uid-26456800-id-3380612.html