日志纪要Logging(一)

161 阅读3分钟

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。

前言

这一节,应该算是整个接口自动化测试框架设计中最简单的一部分了,至于为什么要做日志,这个还得从程序设计开始说起,咱们开发同学在开发程序的时候都知道记日志,一是方便debug调试(本地),二嘛还是为了定位问题(测试或生产),说来说去还是为了方便自己;那这就比较重要了,成功了要写日志、失败了更要写日志,然后在异常的时候也需要写日志,最后通过日志来定位代码bug。

Logging模块

Logging模块是python自有的内置库,不需要安装,直接拿来使用即可;只是咱们对于日志的输出有所要求,是写入文件还是只输出在控制台,还有日志输出级别,假使是文件,如何避免文件过大,如何做日志文件轮询等等问题???

  • 使用日志模块示例:
import logging

logging.info("我是info日志级别")
logging.debug("我是debug日志级别")
logging.error("我是error日志级别")
logging.critical("我是critical日志级别")
logging.warning("我是warning日志级别")
  • 默认控制台输出结果如下⬇⬇⬇
ERROR:root:我是error日志级别
CRITICAL:root:我是critical日志级别
WARNING:root:我是warning日志级别
  • 思考一个问题:为什么是root,为什么只输出3行日志?

分析问题

至于root,很好理解就像是默认输出在控制台一样,因为咱们没有设定任何关于日志的参数,全都使用logging模块默认的配置,源码如下⬇⬇⬇

def getLogger(name=None):
    """
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    """
    if name:
        return Logger.manager.getLogger(name)
    else:
        return root

结论如下:在使用默认的getLogger会返回root,也没有创建输入文件处理器;但是明明有5行日志代码,为啥只有3行输出?这是日志级别决定的。默认输出的日志级别为WARNING,因为使用默认的getLogger函数返回root,源码:root = RootLogger(WARNING);日志级别在logging模块顶部输出:

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

得到日志级别:CRITICAL > ERROR > WARNING > INFO > DEBUG;所以默认会输出warning及以上级别的日志,debug和info则不会输出。

测试代码

既然源码这样说了,也确实这样做了,那么咱们可以按照源码所说的进行改变,不再有root,也稍微调整一下输出日志级别。

import logging

log = logging.getLogger("myLog") # 改名了,随便命名反正不是root

log.setLevel("DEBUG") # 改变输出日志级别

# 为啥要在log前引用logging,否则看不到myLog的日志标识,表示不解。
logging.log(10, "debug日志级别") 

log.debug("我是debug日志级别")
log.info("我是info日志级别")
log.warning("我是warning日志级别")
log.error("我是error日志级别")
log.critical("我是critical日志级别")
  • 输出结果如下⬇⬇⬇
DEBUG:myLog:我是debug日志级别
INFO:myLog:我是info日志级别
WARNING:myLog:我是warning日志级别
ERROR:myLog:我是error日志级别
CRITICAL:myLog:我是critical日志级别

logging模块的原理很简单:首先有日志输入级别,然后再有输出级别,再选择输出渠道:consle或者file。

小结

经过一个小demo的介绍,logging模块是不是理解得清楚多了?