说到日志,无论是开发写代码还是写UI自动化测试,都离不开日志的记录,它能给我们在定位问题、缺陷时带来很大的方便。通常测试人员使用最多的方法就是用print来打印出日志和报错信息,但是对于一些项目比较大的项目,使用print就不是那么方便了。因为print打印出来的日志没有时间,不知道日志记录的位置,针对这种情况,我们可以使用python自带的logging模块,可以很好地解决上面问题。
编译工具:pycharm
编程语言:python
在python提供的log模块,一共把日志级别分为5级,分别为:
1、Debug级是最详细的日志信息,典型的应用场场景是问题诊断。
2、INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作。
3、WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
4、ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
5、CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息
- '''log的使用'''
- import logging
-
- logging.basicConfig(level=logging.INFO) #设置logging的日志级别
- logging.info('infor级调试信息')
- logging.debug('debug级调试信息')
- logging.warning('warning级调试信息')
- logging.error('error级调试信息')
- logging.critical('critical级调试信息')
其中log日志级别程度逐次增高,默认情况下日志的级别是WARNING,低于WARNING级别的日志都不会被输出。
上面说过log日志默认输出WARNING级别的,但是我想要输出INFO级的话就需要设置日志级别输出,在开始记录日志前可以使用logging.basicConfig方法来设定日志级别。
- logging.basicConfig(level=logging.INFO) #设置logging的日志级别为INFO
- logging.info('输出info级调试信息')
- logging.debug('输出debug级调试信息')
- logging.warning('输出warning级调试信息')
- logging.error('输出error级调试信息')
通过设置logging日志级别为INFO后,输出结果如下:
如果我们想要指定log日志输出的格式、保存路径的话,可以用logging.basicConfig函数来实现,其主要参数使用如下:
1、filename:指定日志说出目标文件的文件名,指定该设置项后日志信息就不会被输出到控制台了。
2、filemode:指定日志文件的打开模式,默认为‘a',需要注意的是,该选项要在filename指定时才有效
3、format:指定日志格式字符串,既指定日志输出时所包含的字段信息以及他们的顺序,logging模块定义的格式字段下面会列出
4、datefmt:指定日期/时间格式,需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效
5、level:指定日志器的日志级别
6、stream:指定日志输出目标stream,如sys.stdout,sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发ValueError异常
7、style:Python3.2中新添加的配置项,指定format格式字符串的风格,可取值为“%,{,$”,,默认是'%'。
8、handlers:Python3.3中新添加的配置项,该选项如果被指定,它应该是一个创建了多个handler的可迭代对象,这些handler将会被添加到root logger。需要说明的是:filename,stream和handlers这三个配置项只能有一个存在,不能同时出现2个或3个,否则会引发ValueError异常。
- mport logging
- my_format = '%(asctime)s-%(filename)s-%(module)s-%(lineno)d' #log日志格式设置,打印当前时间,当前执行的程序名称,当前行号、模块。
- logging.basicConfig(
- filename = 'my.log', #日志文件名称
- level = logging.INFO, #设置日志级别为INFO级
- format=my_format
- )
- logging.info('infor')
- logging.debug('debug')
- logging.warning('warning')
- logging.error('error')
- logging.critical('critical')
运行代码后打开my,log可以看到记录的log信息。
对个这个格式,我们可以一起使用,每个格式之间需要使用”-”进行连接,如:
my_format = '%(asctime)s-%(filename)s-%(module)s-%(lineno)d'
使用格式 | 描述信息 | 字段/属性名称 |
%(asctime)s | 打印日志的时间 | asctime |
%(filename)s | 打印当前执行程序名称 | fimename |
%(levelname)s | 打印日志级别名称 | levelname |
%(message)s | 打印日志信息 | message |
%(levelno)s | 打印日志级别的数值 | levelno |
%(pathname)s | 打印当前执行程序的路径 | pathname |
%(funcName)s | 打印日志的当前函数 | funcName |
%(lineno)d | 打印日志的当前行号 | lineno |
%(thread)d | 打印线程id | thread |
%(threadName)s | 打印线程名称 | threadName |
什么是log处理器,我的理解就是把记录生成的log日志进行处理的过程,它就像一个搬运工一样,不生产、制造产品,只负责把物品搬运到指定的位置。Python自己内置了很多的处理器,常见的有:
1、StreamHandler标准流处理器,将消息发送到标准输出流、错误流
2、FileHandler文件处理器,将消息发送到文件
3、RotatingFileHandler文件处理器,文件达到指定大小后,启用新文件存储日志。
4、TimedRotatingFileHandler文件处理器,日志以特定的时间间隔轮换日志文件。
- 例如:
- import logging
- from logging import StreamHandler
- from logging import FileHandler
-
- logger = logging.getLogger(__name__)
-
- # 设置为DEBUG级别
- logger.setLevel(logging.DEBUG)
-
- # 标准流处理器,设置的级别为WARAING
- stream_handler = StreamHandler()
- stream_handler.setLevel(logging.WARNING)
- logger.addHandler(stream_handler)
-
- # 文件处理器,设置的级别为INFO
- file_handler = FileHandler(filename="test.log")
- file_handler.setLevel(logging.INFO)
- logger.addHandler(file_handler)
-
- logger.debug("this is debug")
- logger.info("this is info")
- logger.error("this is error")
- logger.warning("this is warning")
以上就是logging日志的基本使用方法,相信掌握以上方法可以帮助我们更好地理解日志的输出、打印和选择,在今后的UI自动化中不局限于仅仅使用print打印,还可以用logging模块来系统地记录报错信息,定位问题更加方便!