使用python制作简单的日志以及日志分析工具

最近,我需要将多客户模拟器在运行中产生的一些数据记录下来,同时使用适当的方法(例如图形化,还有。。。?)对其进行分析。

1. 日志的记录

python有一个logging模块,可以用来产生日志。

(1)学习资料

http://blog.sina.com.cn/s/blog_4b5039210100f1wv.html

http://blog.donews.com/limodou/archive/2005/02/16/278699.aspx

http://kenby.iteye.com/blog/1162698

http://blog.csdn.net/fxjtoday/article/details/6307285

前边几篇文章仅仅是其它人的简单学习经验,下边这个链接中的内容比较全面。

http://www.red-dove.com/logging/index.html

(2)我需要关注内容

  •  日志信息输出级别

logging模块提供了多种日志级别,如:NOTSET(0),DEBUG(10),

INFO(20),WARNING(30),WARNING(40),CRITICAL(50)。

设置方法:

logger = getLogger()

logger.serLevel(logging.DEBUG)

  • 日志数据格式

使用Formatter设置日志的输出格式。

设置方法:

logger = getLogger()

handler = loggingFileHandler(XXX)

formatter = logging.Formatter(“%(asctime)s %(levelname) %(message)s”,”%Y-%m-%d,%H:%M:%S”)

%(asctime)s表示记录日志写入时间,”%Y-%m-%d,%H:%M:%S“设定了时间的具体写入格式。

%(levelname)s表示记录日志的级别。

%(message)s表示记录日志的具体内容。

  • 日志对象初始化

def initLog():

logger = logging.getLogger()

handler = logging.FileHandler(“日志保存路径”)

formatter = logging.Formatter(“%(asctime)s %(levelname) %(message)s”,”%Y-%m-%d,%H:%M:%S”)

handler.setFormatter(formatter)

logger.addHandler(handler)

logger.setLevel

  • 写日志

logging.getLogger().info(), logging.getLogger().debug()……

2. 日志的分析。

(1)我的日志的内容。(log.txt)

2011-12-12,12:11:31 INFO Client1: 4356175.0 1.32366309133e+12 1.32366309134e+12
2011-12-12,12:11:33 INFO Client1: 4361320.0 1.32366309334e+12 1.32366309336e+12
2011-12-12,12:11:33 INFO Client0: 4361320.0 1.32366309389e+12 1.32366309391e+12
2011-12-12,12:11:39 INFO Client1: 4366364.0 1.32366309934e+12 1.32366309936e+12
2011-12-12,12:11:39 INFO Client0: 4366364.0 1.32366309989e+12 1.32366309991e+12
2011-12-12,12:11:43 INFO Client1: 4371416.0 1.32366310334e+12 1.32366310336e+12
2011-12-12,12:11:43 INFO Client0: 4371416.0 1.32366310389e+12 1.32366310391e+12
2011-12-12,12:11:49 INFO Client1: 4376450.0 1.32366310934e+12 1.32366310936e+12

我需要将上述内容逐行读出,并将三个时间戳提取出来,然后将其图形化。

(2) 文件操作以及字符串的分析。

  • 打开文件,读取出一行日志。

file = file(“日志路径”,“r”)

while True:

line = file.readline()

if len(len) == 0:

break;

print line

file.close()

  • 从字符串中提取数据。

字符串操作学习资料:

http://reader.youdao.com/sharelite?itemId=-4646262544179865983&method=viewSharedItemThroughLink&sharedBy=-1137845767117085734

从上面展示出来的日志内容可见,主要数据都是用空格分隔,所以需要使用字符串的

split函数对字符串进行分割:

paraList = line.split(),该函数默认的分割符是空格,返回值为一个list。

paraList[3], paraList[4], paraList[5]中分别以字符串形式存储着我需要的时间戳。

  • 使用float(paraList[3])将字符串转化为浮点数。

(3)将日志图形化。

matplotlib是python的一个绘图库。我打算用它来将日志图形化。

  • matplotlib学习资料。

matplotlib的下载与安装:

http://yexin218.iteye.com/blog/645894

http://blog.csdn.net/sharkw/article/details/1924949

对matplotlib的宏观介绍:

http://apps.hi.baidu.com/share/detail/21928578

对matplotlib具体使用的详细介绍:

http://blog.sina.com.cn/s/blog_4b5039210100ie6a.html

在matplotlib中设置线条的颜色和形状:

http://blog.csdn.net/kkxgx/article/details/python

如果想对matplotlib有一个全面的了解,就需要阅读教程《Matplotlib for Python developers》,教程下载地址:

http://download.csdn.net/detail/nmgfrank/4006691

  • 使用实例

import matplotlib.pyplot as plt

listX = [] #保存X轴数据
listY = [] #保存Y轴数据
listY1 = [] #保存Y轴数据

file = file(“../log.txt”,”r”)#打开日志文件

while True:
line = file.readline()#读取一行日志
if len(line) == 0:#如果到达日志末尾,退出
break
paraList = line.split()
print paraList[2] print paraList[3] print paraList[4] print paraList[5] if paraList[2] == “Client0:”: #在坐标图中添加两个点,它们的X轴数值是相同的
listX.append(float(paraList[3]))
listY.append(float(paraList[5]) – float(paraList[3]))
listY1.append(float(paraList[4]) – float(paraList[3]))

file.close()

plt.plot(listX,listY,’bo-‘,listX,listY1,’ro’)#画图

plt.title(’tile’)#设置所绘图像的标题

plt.xlabel(‘time in sec’)#设置x轴名称

plt.ylabel(‘delays in ms”)#设置y轴名称

plt.show()