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="用例通过")