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

来源:互联网 发布:数控锥度螺纹编程实例 编辑:程序博客网 时间:2024/06/06 01:40

       我的博客已转移至 http://nmgfrank.com


       最近,我需要将多客户模拟器在运行中产生的一些数据记录下来,同时使用适当

的方法(例如图形化,还有。。。?)对其进行分析。

 

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()              












      

原创粉丝点击