# %(asctime)s 字符串形式的当前时间。
# %(levelname)s 文本形式的日志级别
# %(name)s Logger的名字
# %(filename)s 调用日志输出函数的模块的文件名
# %(funcName)s 调用日志输出函数的函数名
# %(lineno)d 调用日志输出函数的语句所在的代码行
# %(message)s 用户输出的消息
#导包
import logging#定义获取logging函数
def get_logging():# 自定义日志格式: fm = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'"# 设置日志级别level=logging.DEBUG# 将日志信息输出到文件中:filenamelogging.basicConfig(level=logging.DEBUG,filename="../log/log1.log",format=fm)return logging
logging日志模块四大组件
Logger (日志器) :提供了程序使用日志的入口
Handler (处理器 ):将 logger 创建的日志记录发送到合适的目的输出
Formatter( 格式器 ):决定日志记录的最终输出格式
Filter (过滤器 ):提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
Logger常用方法
1.打印日志 : logger.debug() 、logger.info() 、logger.warning() 、logger.error() 、logger.critical()
2.logger.setLevel() :设置日志器将会处理的日志消息的最低严重级别
3.logger.addHandler() :为该logger对象添加一个handler对象
4.logger.addFilter() :为该logger对象添加一个filter对象
Handler处理器 类型:
1. 控制台处理器 StreamHandler()
2. 文件处理器 fileHandler()
3. 根据大小切割 RotatingFileHandler()
4. 根据时间切割 TimedRotatingFileHandler()
import logging
import logging.handlers# 获取logger
logger = logging.getLogger()# 修改名称
logger = logging.getLogger("user")# 设置级别
logger.setLevel(logging.INFO)# 获取控制台 处理器
sh = logging.StreamHandler()# 或取文件处理器
# 根据时间切割
# when:时间单位
# interval: 时间间隔
# backupcount: 保留的备份数量
th = logging.handlers.TimedRotatingFileHandler(filename="../log/logtime.log", when="S", interval=1, backupCount=3)# 设置处理器级别,只有error级别才能输入文件
th.setLevel(logging.ERROR)# 添加格式器
fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
fm = logging.Formatter(fmt)# 将格式器 添加到处理器中
sh.setFormatter(fm)
th.setFormatter(fm)# 将处理器添加到logger
logger.addHandler(sh)
logger.addHandler(th)# 输入信息
logger.debug("debug..")
logger.info("info..")
logger.warning("warning....")
logger.error("err....")
封装
# 导包
import logging.handlersclass GetLogger:logger = None@classmethoddef get_logger(cls):#判断是否为空if cls.logger is None:# 获取日志器cls.logger = logging.getLogger()# 设置日志器级别cls.logger.setLevel(logging.INFO)# 获取控制台 处理器sh = logging.StreamHandler()# 获取文件 处理器th = logging.handlers.TimedRotatingFileHandler(filename="../log/logtime.log", when='midnight', interval=1,backupCount=30, encoding='utf-8')# 设置格式器fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"fm = logging.Formatter(fmt)# 将格式器添加到处理器中sh.setFormatter(fm)th.setFormatter(fm)# 将处理器添加到 日志器cls.logger.addHandler(th)cls.logger.addHandler(sh)return cls.logger
调用
import time
import unittest
from time import sleep
from parameterized import parameterized
from selenium import webdriver
from selenium.webdriver.common.by import Byfrom day07.cal.tool.fz_log import GetLoggerlogger = GetLogger().get_logger()class TestCalc(unittest.TestCase):driver = None@classmethoddef setUpClass(cls):logger.info("正在初始化driver...")# 实例化浏览器cls.driver = webdriver.Chrome()# 打开浏览器url = 'http://cal.apple886.com/'cls.driver.get(url)cls.driver.maximize_window()@classmethoddef tearDownClass(cls):logger.info("正在关闭driver...")# 关闭cls.driver.quit()cls.driver = None# 加法def test_Add(self, num1=20, num2=10, expect=30):logger.info("正在遍历传进来的第一个数字...")# 遍历传进来的数字,并强制转换为字符串# 第一个数for n in str(num1):# 拆开单个按钮的定位方式logger.info("正在点击数字:{}".format(n))self.driver.find_element(By.CSS_SELECTOR, "#simple{}".format(n)).click()logger.info("正在点击加法按钮...")# 点击加法按钮self.driver.find_element(By.CSS_SELECTOR, "#simpleAdd").click()logger.info("正在遍历传进来的第二个数字...")# 第二个数for n in str(num2):# 拆开单个按钮的定位方式logger.info("正在点击数字:{}".format(n))self.driver.find_element(By.CSS_SELECTOR, "#simple{}".format(n)).click()logger.info("正在点击等号按钮...")# 点击等号self.driver.find_element(By.CSS_SELECTOR, "#simpleEqual").click()logger.info("正在获取结果...")# 获取结果result = self.driver.find_element(By.CSS_SELECTOR, "#resultIpt").get_attribute("value")print("实际结果:{},预期结果:{}".format(result, expect))try:logger.info("正在断言...")# 断言self.assertEqual(result, str(expect))except AssertionError:logger.info("正在截图...")# 如果实际结果不等于预期结果 截图self.driver.get_screenshot_as_file('./{}.png'.format(time.strftime("%Y_%m_%d %H_%M_%S")))
结果