在做接口自动化的时候,当接口自动化用例有很多的时候,执行最好添加日志记录模块,添加日志记录,当接口执行失败时候,可以通过日志功能查看运行日志来进行错误排查。

参考文档:https://docs.python.org/zh-cn/3/library/logging.html

日志级别

志记录级别的数值在下表中给出。如果你想要定义自己的级别,并且需要它们具有相对于预定义级别的特定值,那么这你可能对以下内容感兴趣。如果你定义具有相同数值的级别,它将覆盖预定义的值;预定义的名称将失效。

级别 数值
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
NOTSET 0

最基本的使用

日志信息打印在控制台

mylogger.py

  1. # 导入logging
  2. import logging
  3. # 因为默认logging模块显示日志的级别 为 warnging
  4. # 设置logging模块的级别为 debug
  5. logging.basicConfig(level=logging.DEBUG)
  6. logging.debug("这是debug内容")
  7. logging.info("这是 info 内容")
  8. logging.warning("这是警告内容")
  9. logging.error('这是error信息')

执行文件,可以看到结果
image.png
默认日志文件是打印在控制台中,在实际的项目中,日志文件最好保存在文件中。

日志保存在文件中

通过配置日志文件路径

  1. # 导入logging
  2. import logging
  3. # 因为默认logging模块显示日志的级别 为 warnging
  4. # 设置logging模块的级别为 debug
  5. logging.basicConfig(filename="mylogger.log",filemode="a", level=logging.DEBUG,encoding='utf8')
  6. logging.debug("这是debug内容")
  7. logging.info("这是 info 内容")
  8. logging.warning("这是警告内容")
  9. logging.error('这是error信息')

filename 参数指定保存的文件路径
filemode 文件权限

  • w 写入权限
  • a 追加权限

level 日志的级别
encoding 指定日志文件内容字符串。一般设置为utf8

运行上面的代码,可以看到日志会保存到文件中。
image.png
日志保存在文件当中,就会出现问题:不能在控制台中输出。

日志格式

通过添加日志格式可以 自定义显示日志的内容

属性名称 格式 描述
args 此属性不需要用户进行格式化。 合并到 msg 以产生 message 的包含参数的元组,或是其中的值将被用于合并的字典(当只有一个参数且其类型为字典时)。
asctime %(asctime)s 表示 LogRecord 何时被创建的供人查看时间值。 默认形式为 ‘2003-07-08 16:49:45,896’ (逗号之后的数字为时间的毫秒部分)。
created %(created)f LogRecord 被创建的时间(即 time.time() 的返回值)。
exc_info 此属性不需要用户进行格式化。 异常元组(例如 sys.exc_info)或者如未发生异常则为 None。
文件名 %(filename)s pathname 的文件名部分。
funcName %(funcName)s 函数名包括调用日志记录.
levelname %(levelname)s 消息文本记录级别(’DEBUG’,’INFO’,’WARNING’,’ERROR’,’CRITICAL’)。
levelno %(levelno)s 消息数字的记录级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL).
lineno %(lineno)d 发出日志记录调用所在的源行号(如果可用)。
message %(message)s 记入日志的消息,即 msg % args 的结果。 这是在发起调用 Formatter.format() 时设置的。
module — 模块 %(module)s 模块 (filename 的名称部分)。
msecs %(msecs)d LogRecord 被创建的时间的毫秒部分。
msg 此属性不需要用户进行格式化。 在原始日志记录调用中传入的格式字符串。 与 args 合并以产生 message,或是一个任意对象 (参见 使用任意对象作为消息)。
名称 %(name)s 用于记录调用的日志记录器名称。
pathname %(pathname)s 发出日志记录调用的源文件的完整路径名(如果可用)。
process %(process)d 进程ID(如果可用)
processName %(processName)s 进程名(如果可用)
relativeCreated %(relativeCreated)d 以毫秒数表示的 LogRecord 被创建的时间,即相对于 logging 模块被加载时间的差值。
stack_info 此属性不需要用户进行格式化。 当前线程中从堆栈底部起向上直到包括日志记录调用并引发创建当前记录堆栈帧创建的堆栈帧信息(如果可用)。
thread %(thread)d 线程ID(如果可用)
threadName %(threadName)s 线程名(如果可用)
  1. import logging
  2. logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s')
  3. logging.error('hello')

运行可以看到效果
image.png

封装日志模块

理想的情况下,日志既可以在控制台打印出来,也能够保存到文件中。
mylogger.py

  1. """
  2. 定义日志文件
  3. """
  4. import logging
  5. # 配置logging 设置日志记录器的名字
  6. logger = logging.getLogger("apitesting")
  7. # 配置logger的级别
  8. logger.setLevel(logging.DEBUG)
  9. # 配置通用的日志格式 时间 日志级别 记录器名字 日志信息
  10. format = logging.Formatter('%(asctime)s %(levelname)s %(name)s %(message)s')
  11. # 配置控制台打印
  12. sh = logging.StreamHandler()
  13. # 设置日志级别
  14. sh.setLevel(logging.DEBUG)
  15. # 设置日志格式
  16. sh.setFormatter(format)
  17. # 将控制台打印 添加到logger中
  18. logger.addHandler(sh)
  19. # 配置文件存储
  20. fh = logging.FileHandler(filename='mylogger.txt', encoding='utf8')
  21. # 日志文件的 级别
  22. fh.setLevel(logging.DEBUG)
  23. # 日志文件的内容格式
  24. fh.setFormatter(format)
  25. # 将日志文件配置添加到logger
  26. logger.addHandler(fh)
  27. if __name__ == '__main__':
  28. logger.debug('这是 debug 信息')
  29. logger.info("这是 info 信息")

运行代码,可以看到 日志能在控制台输出,也能在文件中保存起来。