python自动化测试(3)--自定义日志类及日志的封装
一、相关概念
在自定义日志之前,我们需要了解如下信息:
1、日志收集器:可以理解为用于收集日志信息的容器;
2、日志级别(Level):
常见的日志级别有:DEBUG、INFO、WARNING、ERROR以及CRITICAL
3、输出渠道(Handle):
控制台输出:StreamHandle
将日志信息保存在文件中:FileHandle
4、日志格式(Format):
一般包含如下信息:日志时间-日志名称-日志级别名称-文件名称-行号-日志信息等
【示例】
1 # 4、设置日志的输出格式 2 fmt = "%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d:%(message)s" 3 formatter = logging.Formatter(fmt)
【说明】
在logging模块中,默认的是root日志收集器,默认的输出级别为:WARNING
二、自定义日志的操作流程
1、导入logging模块:import logging
2、创建日志收集器:logger = logging.getLogger("日志收集器的name")
3、设置日志收集器的日志级别:logger.setLevel(logging.INFO) #设置收集器的级别为INFO
4、给日志收集器创建输出渠道(根据第一部分的内容知:日志输出渠道包含控制台输出和文件输出):下面以控制台输出为例进行介绍,文件输出与之类似
4.1、创建日志的输出渠道:handle1 = logging.StreamHandle()
4.2、可以单独设置日志输出渠道的级别:handle1.setLevel(logging.ERROR) 此步骤可选
【说明】
(1)在未设置日志输出渠道的日志级别时,默认使用日志收集器设置的Level
(2)若需单独设置日志输出渠道的日志级别,则它的日志级别需高于日志收集器级别,否则设置无效。
5、设置日志输出的内容格式
1 # 4、设置日志的输出格式 2 fmt = "%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d:%(message)s" 3 formatter = logging.Formatter(fmt)
6、将设置的日志格式绑定到创建的输出渠道中,即将日志格式与输出渠道关联起来
handler1.setFormatter(formatter)
7、将设置好的输出渠道,添加到日志收集器中
logger.addHandler(handler1)
【补充】将日志信息输出到文件的操作流程与之类似,只是在step4上有一点区别而已
handler2 = logging.FileHandler(filename="xxx.log",encoding="utf-8")
三、代码实现
1 import logging 2 3 # 1、创建日志收集器 4 logger = logging.getLogger(name="login_test") 5 6 # 2、设置日志收集器的级别:警告级别 7 logger.setLevel(logging.WARN) 8 9 # 3、设置日志的输出渠道 10 # 3.1 控制台日志输出 11 handler1 = logging.StreamHandler() 12 # 3.2 文件日志输出 13 handler2 = logging.FileHandler(filename="my_log.log",encoding="utf-8") 14 # 单独设置输出渠道的日志级别 15 handler1.setLevel(logging.ERROR) # 可选 16 17 # 4、设置日志的输出格式 18 fmt = "%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d:%(message)s" 19 formatter = logging.Formatter(fmt) 20 21 # 5、关联3和4 22 handler1.setFormatter(formatter) 23 handler2.setFormatter(formatter) 24 25 # 6、关联1和5 26 logger.addHandler(handler1) 27 logger.addHandler(handler2) 28 29 # 测试 30 logger.warning("登录失败警告") 31 logger.error("登录debug出错")
四、自定义日志的封装
由于自定义日志的操作流程相对比较固定,因此我们可以将自定义的日志封装成一个类。当我们需要使用时,只需引入该模块即可。
1、通过查看源码知,封装的类需要继承logging.Logger类,这样就可以继承父类的debug()、info()等函数;
2、从第二部分的操作流程知,不同的用户在引入该模块时,可能会设置不同日志名称、日志级别以及日志文件信息,因此这些参数可以让用户在实例化日志对象对象时进行初始化设置;
3、当我们需要使用自定义的日志类时,引入这一模块即可。
1 import logging 2 3 # 对日志的操作进行封装 4 class MyLogger(logging.Logger): 5 6 def __init__(self,name,level,file=None): 7 super().__init__(name,level) 8 # 设置日志的输出渠道 9 handler1 = logging.StreamHandler() 10 # 设置日志的输出格式 11 fmt = "%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d:%(message)s" 12 formatter = logging.Formatter(fmt) 13 handler1.setFormatter(formatter) 14 # 添加日志的输出渠道 15 self.addHandler(handler1) 16 17 if file: 18 handler2 = logging.FileHandler(filename=file,encoding="utf-8") 19 handler2.setFormatter(formatter) 20 self.addHandler(handler2) 21 pass 22 pass 23 pass