前言:
在我们做测试自动化框架设计的时候,需要对日志模块进行二次开发,以方便我们后面进行关键日志记录和报错日志排查,本章主要分享我在对日志做二次封装过程中的一些小技巧和方法
一、logging模块简介
logging日志模块与print的区别:
① logging可以设置不同的日志级别
② 可以指定如何输出及输出的位置应用场景:当需要看大量的地方或者在一个文件中查看的时候,这时print不太方便,所以python引入了logging模块来记录我想要的信息
③ logging相对print来说更好控制输出在哪个地方,怎么输出及控制消息级别来过滤掉那些不需要的信息
二、logging模块日志级别划分
级别排序:DEBUG<INFO<WARNING<ERROR<CRITICAL
① DEBUG:最详细的日志信息,典型应用场景是 问题诊断
② INFO:信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
③ WARNING:当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
④ ERROR:由于一个更严重的问题导致某些功能不能正常运行时记录的信息
⑤ CRITICAL:当发生严重错误,导致应用程序不能继续运行时记录的信息
三、logging模块定义的模块级别的常用函数
① logging.debug(msg,*args,**kwargs)
创建一条严重级别为DEBUG的日志记录
② logging.info(msg,*args,**kwargs)
创建一条严重级别为INFO的日志记录
③ logging.warning(msg,*args,**kwargs)
创建一条严重程度为WARNIN的日志记录
④ logging.error(msg,*args,**kwargs)
创建一条严重程度为ERROR的日志记录
⑤ logging.critical(msg,*args,**kwargs)
创建一条严重程度为CRITICAL的日志记录
⑥ logging.log(level,*args,**kwargs)
创建一条严重级别为level的日志记录
⑦ logging.basicConfig(**kwargs)
对root logger进行一次性配置
四、logging模块四大组件类
日志的四大组件:日志器、处理器、过滤器、格式器
- 日志器:logger,提供了应用程序可一直使用的接口
- 处理器:Handler,将logger创建的日志记录发送到合适的目的输出
- 过滤器:Filter,提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
- 格式器:Formatter,决定日志记录的最终输出格式
五、logging模块使用常用流程
六、logging模块二次封装
本次封装思想就是将上面流程各部分进行方法封装,最后再进行组合调用
具体流程大致为创建日志器=》设置日志级别=〉封装格式器=》封装控制台处理器=〉封装文件处理器=》调用控制台处理器和文件处理器并返还日志器
这样我们在调用最后一个方法的时候,就相当于在日志器里面,添加了我们所要的格式,添加了文件处理器和控制台处理器,这样我们在进行日志器调用的时候,不用现场进行组装和设置格式
接下来进行详细讲解封装步骤:
首先我们先将logging模块和traceback模块导到文件里面,然后构造方法里面参数给log将要写到的位置,当然后面我们在实际框架设计的时候,这个地方的文件路径都会写到配置文件里面进行管理,由于这里做演示,就不讲配置文件如何调用了
这里的构造方法里面,我们创建了日志器和设置了对应的日志级别,由于我们最后想要的带固定格式的日志,然后想让它在控制台打印,又想要在日志文件中记录,这就需要添加三个方法了
第一个要添加的方法是格式器,这个会用在我们设置日志打印格式上面:
这里我们返回了两种格式的格式器,这里按需封装,一般一个就可以了,对应个时期里面包含哪些信息,这个可以参考logging.Formatter里面的源码:
选择需要的参数添加进去就可以了
然后我们需要添加控制台处理器和文件处理器,用于我们后面在文件写日志和在控制台打印日志:
注意这里的文件处理器是需要传入日志文件路径的,需要将构造方法里面的参数给它
最后我们将日志器返还回去
这一步相当于在返还日志器的时候,调用了setStramHandle和setFileHandle方法,相当于给日志器添加了这两个属性,同时这两个方法里面,又各自设置了各自的格式器,并添加了各自输出的日志级别,其中文件处理器记录的是INFO级别以上的日志信息,控制台处理器打印DEBUIG级别以上的日志
在我们做类设计的时候,还需要考虑我们后面调用的方便性,所以在文件最后,重新写了一个方法,该方法实例化了我们封装的日志模块,后面我们调用直接调这个函数就行
七、查看封装后的日志使用效果
这里使用了traceback模块抛出了很详细的日志内容,我们可以对比一下不使用traceback抛出的异常情况
上面是使用异常处理后抛出的Exception异常,我们看到这个就只有一句话,其实对于我们更好更快的分析报错原因,总是觉得差了点什么,下面介绍使用traceback配合打印日志
我们看到使用traceback之后打出的日志就很详细了,使用前的日志就只是一句报错,没有文件信息,没有报错位置,使用traceback配合之后,打出的日志,详细到哪个文件,文件的绝对路径,报错行号,以及出错的原因在这一行的哪里,这样我们在分析问题的时候,就能直接去对应的文件,找对应的行号,对应出错的地方进行检查了