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的帖子收到一个"赞" ...
随机推荐
- 面向对象高级编程——使用__slots__
正常情况下,我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Student ...
- 设置linux下shell显示不同颜色的字体
实例代码如下: #!/bin/bash clear echo -e "\033[1m Hello World" # bold effect echo -e "\033[5 ...
- bootstrap插件实用方法
完全通过js來配置 <p><a id="YOUR_BUTTON_FOR_POPOVER" class="btn btn-primary" ro ...
- javaweb学习纲要
Java Web 概述 大纲: 1.C/S体系结构 2.B/S体系机构 3.两种体系结构比较 4.主流的Web程序应用平台 5.java web学习路线图 1.C/S体系结构 C/S是Client/ ...
- PAT 天梯赛 L1-027. 出租 【模拟】
题目链接 https://www.patest.cn/contests/gplt/L1-027 题意 给出一串电话号码,找出其中不同数字的个数,并且按递减顺序排列,然后 有一个index 数组,指出每 ...
- Objective-C与Swift的混合编程
Swift 被设计用来无缝兼容 Cocoa 和 Objective-C .在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objecti ...
- 第二节课-Data-driven approach:KNN和线性分类器分类图片
2017-08-12 1.图片分类是很多CV任务的基础: 2.图片分类要面临很多的问题,比如图片被遮挡,同一种动物有很多种颜色,形状等等,算法需要足够强壮: 3.所以很难直接写出程序来进行图片分类,常 ...
- Nginx location指令匹配顺序规则
location匹配命令 1. “= ”,字面精确匹配, 如果匹配,则跳出匹配过程.(不再进行正则匹配) 2. “^~ ”,最大前缀匹配,如果匹配,则跳出匹配过程.(不再进行正则匹配) 3. 不带任何 ...
- nginx流量全copy记录
参考:http://tyrion.iteye.com/blog/2311987 准备两台服务器: 0.0.0.1 0.0.0.2 在 0.0.0.1上 . 下载 wget https://github ...
- QT QFtp使用实例 从FTP下载一个文件
1. ftp://ftp.denx.de/pub/u-boot/lowboot-1.0.0.patch.gz 下载文件 FtpGet.h #ifndef FTPGET_H #define FTPGE ...