python 读log文件

利用python语言实现读取log文件。并分析文件,计算平均每个事务所用的平均时间,最长,最短时间,统计不完整事务(就是有开始没结束的情况)的总数和详情

部分源码:
# -*- coding: cp936 -*-
#操作系统:winxp
#python版本:2.5

#匹配事务并计算
from datetime import datetime
from DTime import DTime
from DataConvert import DataConvert
class log:

def log(self):

#放置未匹配完成的数据
temp=dict()

#存放待匹配的数据
tempTime=dict()

#存放已匹配完成的数据
avg=dict()

dt=DTime()

i=0

b=True

dc=DataConvert()

items=dc.getData()

strs=items.values()

datas=items.keys()

while b:
try:
#判断数据在之前是否已经存在
order=strs[i][0]
key=strs[i][5]
dtime=strs[i][2]
if temp.has_key(key):
#调用时间转换函数
usetime=dt.convertTime(tempTime.get(key))
othertime=dt.convertTime(dtime)
if usetime>othertime:
usetime=usetime-othertime
elif usetime<othertime:
usetime=othertime-usetime
else:
usetime=usetime-usetime
temp.pop(key)
tempTime.pop(key)
avg[order]=usetime
else:
tempTime[key]=dtime
for k in datas:
if items.get(k)==strs[i]:
temp[key]=k
i=i+1
except:
b=False
print '共处理',i,'条数据'

dc.storeTemp(temp)
return (avg,temp)

#x=log()
#t=x.log()


# -*- coding: cp936 -*-
#从日志文件中得到数据,并处理得到的数据
from File import File
from filterData import filterData
class DataConvert:

def getData(self):

i=0

b=True

self.f=File()

data=dict()

ls=self.f.loadLog()

fd=filterData()

strs=fd.filterStr(ls)

print '加载上次未匹配完的数据'
t=self.f.loadTemp()


if t!=None:
if len(t)!=0:
for value in t.values():
strs.append(value)
print '成功添加上次未匹配完的数据',len(t),'条'

#分解数据
while b:
try:
order=strs[i].split(' ',1)
ip=order[1].split(' [',1)
dtime=ip[1].split('] ',1)
desc=dtime[1].split(': ')
answer=desc[1]
key=strs[i].split(' [')

if data.get(strs[i])!=strs[i]:
l=list()
l.append(order[0])
l.append(ip[0])
l.append(dtime[0])
l.append(desc[0])
l.append(answer)
l.append(key[0])
data[strs[i]]=l
i=i+1
except:
b=False
print '数据转换处理完毕'
return data

def storeTemp(self,temp):
self.f.storeTemp(temp)



#dc=DataConvert()
#dc.getData()


# -*- coding: cp936 -*-
#时间转换类
from datetime import datetime
class DTime:
#datetime(*(time.strptime(date_string, format)[0:6]))
def convertTime(self,dtime):
str=dtime.split(' ')
d=str[0].split('-')
t=str[1].split(':')
yy=d[0]
mm=d[1]
dd=d[2]
hh=t[0]
m=t[1]
ss=t[2]
return datetime(int(yy),int(mm),int(dd),int(hh),int(m),int(ss))


# -*- coding: cp936 -*-
#扫描日志文件
#log为新的要扫描的日志文件
#temp为上次扫描过程中未匹配完的的数据
import cPickle as p
class File:

def loadLog(self):
try:
f=open('log','r')
strs=f.readlines()
return strs
except:
print '加载文件失败,请查看文件是否存在'
finally:
f.close()

def storeTemp(self,data):
try:
f=open('temp','w')
p.dump(data, f)
f.close()
except:
print '存储未匹配完成的数据失败'
finally:
f.close()

def loadTemp(self):
try:
f=open('temp','r')
data=p.load(f)
return data
except:
print '文件中没有数据'
finally:
f.close()


#f=File()
#print f.loadTempTime()



# -*- coding: cp936 -*-

#过滤数据是否合法
class filterData:

def filterStr(self,strs):

i=0

print '一共扫描到',len(strs) ,'条数据'

for spares in strs:
spare=spares.split(' ')
if len(spare)!=7:
i=i+1
strs.remove(spares)
if i!=0:
print '丢弃了',i ,'条不合格的数据'
return strs



#fd=filterData()
#fd.filterStr()

# -*- coding: cp936 -*-
#报表类
class Report:

def report(self,args):
avg=args[0]
leave=args[1]
values=avg.values()
max=values[0]
min=values[0]
maxkeys=list()
minkeys=list()
#find the max value and min value
for value in values:
if max<value:
max=value
if min>value:
min=value
keys=avg.keys()
print '--------------------------报告----------------------------'
print '---完整事务---'
print '完整的事务有:',len(avg),' 个'
print ' 详情如下:'
for key in keys:
if avg.get(key)==max:
maxkeys.append(key)
if avg.get(key)==min:
minkeys.append(key)
#j=j+1
print ' 事务',key,' 的时间为:',avg.get(key)
print ' 其中,最长时间相同的事务有:',len(maxkeys),'个'
for maxkey in maxkeys:
print ' 事务为',maxkey,' 的时间为:',avg.get(maxkey)
print ' 其中,最短时间相同的事务有:',len(minkeys),'个'
for minkey in minkeys:
print ' 事务为',minkey,' 的时间为:',avg.get(minkey)
print '----------------------------------------------------------'
print '---不完整事务----'
print '不完整的事务有:',len(leave),' 个'
print ' 详情如下:'
keys=leave.keys()
for key in keys:
print ' ',leave.get(key)
print '--------------------------结束-----------------------------'

# -*- coding: cp936 -*-
#测试log类
import unittest
from report import Report
from log import log
class TestLog(unittest.TestCase):


def setUp(self):
self.r=Report()
self.Log=log()

def tearDown(self):
self.r=None
self.Log=None

def testLog(self):
test=self.Log.log()
assert test!=None,'测试通过'
#打印报告
self.r.report(test)

def main(self):
suite = unittest.TestLoader().loadTestsFromTestCase(TestLog)
unittest.TextTestRunner().run(suite)


test=TestLog("testLog")
test.main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值