python logging模块学习记录

最近在逛论坛发现很多小伙伴分享的接口测试框架中都增加了日志模块,想想也对毕竟log是最基本的东西,用于存储每条case的request和response。其中logging模块是用的最多的,老实说这个模块对我来说刚开始还是挺难用的,看的很多遍也算是捋顺了一些,写下来希望能对别人有点作用。ps:我是根据testerhome一篇帖子内容加一下自己的东西的,我会在后面加上该帖子的url,有兴趣的可以去看看。

logging模块主要的用于输出日志,这个模块可以控制日志的输出格式,也可以根据日志的级别将日志打印到控制台和写出文件中。

1.logger=logging.getLogger()用于实例化,其中getLogger()可以传入string类型参数,也就是name来区分不同的logging实例,可以支持继承,我目前还没有用到。

2.实例化的logger可以设置打印的日志等级logger.setLevel(),日志的等级一共分成5种从小到大排序是:debug,info,warning,error和critical。这个可能对于rd用处比较多,因为他们把日志的等级区分很细,我目前在写接口测试中没有写这么多,就是把request和reponse都打印出来,所以就直接使用info。

3.日志的输出格式formatter,说得通俗点就是你的日志里面要打印什么,具体是日志时间,当前程序名称,日志级别和要输出的消息等等,还有一些了,常用也就这个4个,其他我也没见人用过。采用%(<dict key>s)的形式,就是字典关键字替换。%()里面是关键字,后面的‘s’可以控制字节数,比如说可以设置20s,超过20个就不展示,不足20就是用空格代替。

formatter=logging.Formatter('%(asctime)s - %(filename)s :%(levelname)s  %(message)s')

4.handler是用来控制将日志打印到哪里,我用到2个类,一个是 logging.StreamHandler ()用于将日志输出到控制台,另一个就是 RotatingFileHandler()这个一方面可以把日志打印到具体路径的用文本存储下来,还可以通过参数来控制一个文本最大字节数和备份多少个文本,还是特别强大的。

既然有文本的输出肯定有要输出的级别和打印日志的格式就是上面的说得setLevel()和formatter。下面写两个例子:

def set02():

    #实例化name是stream

    logger=logging.getLogger('stream')

    logger.setLevel(logging.INFO)

    #实例化handler,handler用于把日志输出到哪里

    sh=logging.StreamHandler(stream=sys.stdout)

    #设置日志的输出级别

    sh.setLevel(logging.INFO)

    fmt=logging.Formatter('%(levelname)s:%(name)s:%(message)s')

    sh.setFormatter(fmt=fmt)

    logger.addHandler(sh)

    logger.info('info message')

和刚刚写的思路一样的:首先实例化logger,通过setLevel()来控制要输出日志的级别,fmt控制日志的输出格式,addHandler()把设置到好的handler添加进去然后生效。这里面有一个小坑是我写的时候发现的就是实例化logger的时候设置一个setLevel(),在实例化StreamHandle()又有一个setLevel(),这两个地方设置的一样当然没问题如果一个写成了INFO,另一个写成了WARNING的话,我测试了一下是已那个地方设置的level高以那个为准,也就是说无论在logger还是在hanler中设置的了只要设置成了WARNING那么只会打印WARNING级别以上的日志。

def set03():

    logger=logging.getLogger('rotatingfile')

    logger.setLevel(logging.INFO)

    

    rfh=RotatingFileHandler(filename='log.out',

                            maxBytes=20,

                            backupCount=5)

    logger.addHandler(rfh)

    for i in range(20):

        logger.info('i={}'.format(i))

    #glob用于搜索返回匹配的文件路径列表

    logfiles=glob.glob('log.out*')

    for filename in logfiles:

        print filename

同样也是首先实例化logger,并设置setLevel()。实例化 RotatingFileHandler(filename,maxBytes,backupCount).filename:要打印的日志的绝对路径。maxBytes:每一个文本存储最大字节数单位B,1KB=1024B,1M=1024KB,比如设置成10M就是maxBytes=10*1024*1024。backupCount:如果超过maxBytes时会自动添加第二个文件,backupCount就是一公存多少个文件。

这里面用还用到了python自带的glob库,这个库可以查找指定文件路径的文件其实就是glob.glob()里面是要查找的局对路径下的要查找文件。用到3个通配符‘*’,‘?’,‘[]’。‘*’代表要匹配0个或者多个字符。‘?’代表匹配一个字符。‘[]’代表要查找的范围比如说[0-5]就是在0到5中间所有的包含0和5.

我用到就是这些,整体我看了好多好久才慢慢理解,在维护接口框架上还是遇到很多坑,在论坛上经常看看别人怎么写的,后面再写一下我用到其他东西,今天没啥事就赶紧把logging写出来,感觉写的还是挺糙的,我在想想怎么写会效果更好一点。

最后附上论坛上文章的地址:https://testerhome.com/topics/8206。有兴趣自己可以多去逛逛


















猜你喜欢

转载自blog.csdn.net/gogoboi_jin/article/details/74941139