logging日志模块

一、logging模块日志级别

DEBUG、INFO、WARNING、ERROR、CRITICAL

五个等级对应五种打日志的方法:debug、info、warning、error、critical

默认的是跟踪WARNING及以上级别

import logging

logging.debug("这是一条debug级别的日志")
logging.info("这是一条info级别的日志")
logging.warning("这是一条warning级别的日志")
logging.error("这是一条error级别的日志")
logging.critical("这是一条critical级别的日志")

#得到结果如下:
WARNING:root:这是一条warning级别的日志
ERROR:root:这是一条error级别的日志
CRITICAL:root:这是一条critical级别的日志

影响输出的级别等级的有两个因素:①日志收集器的收集等级;②日志输出渠道的输出等级

二、日志收集器修改等级

设置日志收集器的收集等级:①创建一个日志收集器(运用logging.getLogger(),不传参的话默认返回默认的日志收集器root);②修改它的收集等级

import logging

mylog = logging.getLogger()
mylog.setLevel("DEBUG")

logging.debug("这是一条debug级别的日志")
logging.info("这是一条info级别的日志")
logging.warning("这是一条warning级别的日志")
logging.error("这是一条error级别的日志")
logging.critical("这是一条critical级别的日志")

#得到结果如下:
DEBUG:root:这是一条debug级别的日志
INFO:root:这是一条info级别的日志
WARNING:root:这是一条warning级别的日志
ERROR:root:这是一条error级别的日志
CRITICAL:root:这是一条critical级别的日志

注:setLevel设置收集等级时,级别必须全大写字母,如DEBUG

三、日志输出渠道

有两种输出方式:一是输出到控制台;二是输出到文件

1、输出到控制台:①创建一个输出渠道(运用logging.StreamHandler());②设置输出渠道的等级;③将输出渠道和日志收集器绑定

2、输出到文件:①创建一个输出渠道(运用logging.FileHandler());②设置输出渠道的等级;③将输出渠道和日志收集器绑定

import logging

# 日志收集器的收集等级设定
mylog = logging.getLogger()
mylog.setLevel("DEBUG")

# 输出渠道:输出到控制台,输出等级设定为WARNING
sh = logging.StreamHandler()
sh.setLevel("WARNING")
mylog.addHandler(sh)

# 输出渠道:输出到文件,输出等级设定为WARNING
fh = logging.FileHandler("输出到文件的日志.log", encoding="utf8")
fh.setLevel("WARNING")
mylog.addHandler(fh)

logging.debug("这是一条debug级别的日志")
logging.info("这是一条info级别的日志")
logging.warning("这是一条warning级别的日志")
logging.error("这是一条error级别的日志")
logging.critical("这是一条critical级别的日志")

#控制台中的得到结果如下:
这是一条warning级别的日志
这是一条error级别的日志
这是一条critical级别的日志

此例中,日志收集器的收集等级定为DEBUG,日志输出渠道的输出等级定为WARNING,所以最终的输出结果为WARNING及以上级别

四、创建自己的日志收集器

在创建日志收集器时,进行传参即可:

import logging

# 日志收集器的收集等级设定
mylog2 = logging.getLogger("yuan")
mylog2.setLevel("DEBUG")

# 输出渠道:输出到控制台,输出等级设定为ERROR
sh = logging.StreamHandler()
sh.setLevel("ERROR")
mylog2.addHandler(sh)

# 输出渠道:输出到文件,输出等级设定为ERROR
fh = logging.FileHandler("输出到文件的日志.log", encoding="utf8")
fh.setLevel("ERROR")
mylog2.addHandler(fh)

mylog2.debug("这是一条debug级别的日志")
mylog2.info("这是一条info级别的日志")
mylog2.warning("这是一条warning级别的日志")
mylog2.error("这是一条error级别的日志")
mylog2.critical("这是一条critical级别的日志")

#得到结果为:
这是一条error级别的日志
这是一条critical级别的日志

此外,还可以对输出的格式进行设置:

①设定输出的格式;②创建一个输出格式对象(运用logging.Formatter());③将格式对象添加到输出渠道中(运用setFormatter())

import logging

# 日志收集器的收集等级设定
mylog2 = logging.getLogger("yuan")
mylog2.setLevel("DEBUG")

# 输出渠道:输出到控制台,输出等级设定为ERROR
sh = logging.StreamHandler()
sh.setLevel("ERROR")
mylog2.addHandler(sh)

# 输出渠道:输出到文件,输出等级设定为ERROR
fh = logging.FileHandler("输出到文件的日志.log", encoding="utf8")
fh.setLevel("ERROR")
mylog2.addHandler(fh)

# 设置输出格式
formats = "%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:%(message)s"
form = logging.Formatter(formats)
sh.setFormatter(form)
fh.setFormatter(form)

mylog2.debug("这是一条debug级别的日志")
mylog2.info("这是一条info级别的日志")
mylog2.warning("这是一条warning级别的日志")
mylog2.error("这是一条error级别的日志")
mylog2.critical("这是一条critical级别的日志")

#得到结果如下:
2021-09-25 12:33:11,223-[myown_logging.py-->line:26]-ERROR:这是一条error级别的日志
2021-09-25 12:33:11,223-[myown_logging.py-->line:27]-CRITICAL:这是一条critical级别的日志

注:输出的格式可以自定义,是多种多样的

五、日志轮转

有两种设置方式:①按时间轮转;②按文件大小轮转

在创建输出渠道(输出到文件)时设置即可

1、按时间轮转(TimedRotatingFileHandler)

为使用方便,先从logging模块中导入TimedRotatingFileHandler

import logging
from logging.handlers import TimedRotatingFileHandler

# 日志收集器的收集等级设定
mylog2 = logging.getLogger("yuan")
mylog2.setLevel("DEBUG")

# 输出到文件,文件按时间轮转,输出等级设定为ERROR
fh = TimedRotatingFileHandler("按时间轮转的日志文件.log", encoding="utf8", when="D", interval=1, backupCount=7)
fh.setLevel("ERROR")
mylog2.addHandler(fh)

# 设置输出格式
formats = "%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:%(message)s"
form = logging.Formatter(formats)
fh.setFormatter(form)

mylog2.debug("这是一条debug级别的日志")
mylog2.info("这是一条info级别的日志")
mylog2.warning("这是一条warning级别的日志")
mylog2.error("这是一条error级别的日志")
mylog2.critical("这是一条critical级别的日志")

2、按文件大小轮转(RotatingFileHandler)

为使用方便,先从logging模块中导入RotatingFileHandler

import logging
from logging.handlers import RotatingFileHandler

# 日志收集器的收集等级设定
mylog2 = logging.getLogger("yuan")
mylog2.setLevel("DEBUG")

# 输出到文件,文件按每20Mb进行轮转,输出等级设定为ERROR
fh = RotatingFileHandler("按文件大小轮转的日志文件.log", encoding="utf8", maxBytes=1024 * 1024 * 20, backupCount=7)
fh.setLevel("ERROR")
mylog2.addHandler(fh)

# 设置输出格式
formats = "%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:%(message)s"
form = logging.Formatter(formats)
fh.setFormatter(form)

mylog2.debug("这是一条debug级别的日志")
mylog2.info("这是一条info级别的日志")
mylog2.warning("这是一条warning级别的日志")
mylog2.error("这是一条error级别的日志")
mylog2.critical("这是一条critical级别的日志")

六、将测试用例执行情况记录到日志中

首先将自己创建的日志收集器、日志输出渠道、输出格式等进行封装

import logging


def create_logger():
    # 日志收集器的收集等级设定
    mylog2 = logging.getLogger("yuan")
    mylog2.setLevel("DEBUG")

    # 输出渠道:输出到控制台,输出等级设定为ERROR
    sh = logging.StreamHandler()
    sh.setLevel("ERROR")
    mylog2.addHandler(sh)

    # 输出渠道:输出到文件,输出等级设定为ERROR
    fh = logging.FileHandler("输出到文件的日志.log", encoding="utf8")
    fh.setLevel("ERROR")
    mylog2.addHandler(fh)

    # 设置输出格式
    formats = "%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:%(message)s"
    form = logging.Formatter(formats)
    sh.setFormatter(form)
    fh.setFormatter(form)

    return mylog2


log = create_logger()

然后,在执行测试的模块中,导入上面的log:

import unittest
from ddt import ddt, data
from exercise04_ddt.funcdemo_unittest import login_check
from exercise05_excel.python_excel读取和写入封装 import HandleExcel
from exercise06_logging模块.mylogging_module import log


@ddt
class LoginTestCase(unittest.TestCase):
    excel = HandleExcel("cases.xlsx", "yuan")
    res_data = excel.read_data()  # res_data就是列表嵌套字典的测试用例所需数据形式,但是字典中的值都是数值或字符串类型

    @data(*res_data)
    def test_login(self, case):
        expected = eval(case["expected"])
        data = eval(case["data"])
        res = login_check(*data)
        row = case["case_id"] + 1
        try:
            self.assertEqual(expected, res)
        except AssertionError as e:
            self.excel.write_data(row=row, column=5, value="用例未通过")
            log.error("用例:--{}--执行未通过".format(case["case_name"]))  # 将未通过的用例写到日志中
            raise e
        else:
            self.excel.write_data(row=row, column=5, value="用例通过")

 

posted @ 2021-09-25 14:04  2orange  阅读(60)  评论(0编辑  收藏  举报