首先介绍一下:
logging --是python自带的一个日志模块
1、代替print,可以把大部分想要调试的信息打印出来或者是输出到指定的文件。
2、可以对一些输出的调试信息分类做输出,级别控制。
分别代表的意思:调试、打印、警告、错误、严重错误警告
每一级都是渐渐深入的过程。
运行下面一段代码:
import logging
# 级别控制:# 默认收集的是 warning (包括warning)以上的问题
logging.debug('小小今天很活跃')
logging.info('小小666')
logging.warning('pp')
logging.error('lll')
logging.critical('小夏')
控制台输出的是:
WARNING:root:pp ERROR:root:lll CRITICAL:root:小夏
为什么?因为默认收集的是 warning (包括warning)以上的问题
WARNING:root:pp 代表什么意思,即是:级别、日志收集器默认为root、内容
3、写日志需要经过的两个渠道:
Logger 收集日志 debug info error
handdler 输出日志的渠道,指定的文件,还是控制台,一般默认到控制台
import logging
# 定义一个日志收集器 # 如果不设置级别 或者 'python11' 为空,那么它将会默认从warning以上去收集(不包含warning)
my_logger = logging.getLogger('python11')
# 设定级别 注意的是 DEBUG 要大写
my_logger.setLevel('DEBUG')
# 创建我们自己的输出渠道,StreamHandler 输出到控制台
ch = logging.StreamHandler()
ch.setLevel('DEBUG')
# 把收集渠道和输出渠道对接
my_logger.addHandler(ch)
# 收集日志
my_logger.debug('python11期')
my_logger.info('pyton11期,6')
my_logger.error('python11期,最强!')
因为我们日志收集器设定的级别是:DEBUG 还有我们输出渠道定义的也是DEBUG,所有我们采集信息日志是从DEBUG开始采集的。
所以输出到控制台的结果是:
python11期 pyton11期,6 python11期,最强!
4、logging的应用:
(a)
import logging
# 创建一个收集器
my_logging = logging.getLogger('项目名称')
# 定义级别,收集的是DEBUG以上的级别
my_logging.setLevel('DEBUG')
# 定义一个输出到控制台的渠道Stream-->控制台Handler组织
ch = logging.StreamHandler()
# 定义一个输出到文件渠道
fh = logging.FileHandler('fhandler.txt', encoding='utf-8')
# 设置输出控制器的级别 输出的时候包含定义的级别,其中输出到控制台是error以上级别,输出到文本的是debug以上级别
ch.setLevel('ERROR')
fh.setLevel('DEBUG')
# 把收集控制器和输出控制器连接起来 指定到输出渠道
my_logging.addHandler(ch)
my_logging.addHandler(fh)
# 采集信息
my_logging.debug('控制住这条信息debug')
my_logging.info('控制住这条信息info')
my_logging.warning('控制住这条信息warning')
my_logging.error('控制住这条信息error')
my_logging.critical('控制住这条信息critical')
# 关闭日志收集器
my_logging.removeHandler(ch)
my_logging.removeHandler(fh)
输出结果是:
(b)
formatter:决定日志记录的最终输出格式(不然日志会乱七八糟)Formatter对象定义了最终log信息的顺序,
结构和内容,规定了日志输出按照什么样的格式,默认的时间格式为:%Y-%m-%d %H:%M:%S,下面是 formatter 常用的一些信息
import logging
# 创建一个收集器 名称:收到错误级别
my_logging = logging.getLogger('项目')
# 定义级别,收集的是DEBUG以上的级别
my_logging.setLevel('DEBUG')
# 设置输出格式:包括时间、级别、项目名,还有执行文件名等等
formatter = logging.Formatter('%(asctime)s-%(levelname)s-%(filename)s-%(name)s-日志信息:%(message)s')
# 定义一个输出到控制台 Stream-->控制台 Handler 组织,操作者
ch = logging.StreamHandler()
ch.setLevel('ERROR')
ch.setFormatter(formatter)
fh = logging.FileHandler('fhandler.txt', encoding='utf-8')# 文件路径可以自己设置
fh.setLevel('DEBUG')
fh.setFormatter(formatter)
# 把收集控制器和输出控制器连接起来 指定到输出渠道
my_logging.addHandler(ch)
my_logging.addHandler(fh)
# 采集信息
my_logging.debug('控制住这条信息debug')
my_logging.info('控制住这条信息info')
my_logging.warning('控制住这条信息warning')
my_logging.error('控制住这条信息error')
my_logging.critical('控制住这条信息critical')
# 关闭日志收集器
my_logging.removeHandler(ch)
my_logging.removeHandler(fh)
结果为:
控制台输出:
2021-10-04 21:00:45,525-ERROR-login_wk.py-项目-日志信息:控制住这条信息error 2021-10-04 21:00:45,525-CRITICAL-login_wk.py-项目-日志信息:控制住这条信息critical
文件fhandler.txt输出:
2021-10-04 21:00:45,524-DEBUG-login_wk.py-项目-日志信息:控制住这条信息debug 2021-10-04 21:00:45,525-INFO-login_wk.py-项目-日志信息:控制住这条信息info 2021-10-04 21:00:45,525-WARNING-login_wk.py-项目-日志信息:控制住这条信息warning 2021-10-04 21:00:45,525-ERROR-login_wk.py-项目-日志信息:控制住这条信息error 2021-10-04 21:00:45,525-CRITICAL-login_wk.py-项目-日志信息:控制住这条信息critical
最后写了一个类,方便定位级别和调用。
import logging
class My_log():
def mylog(self, msg, level):
# 创建一个收集器 名称:项目
my_logging = logging.getLogger('项目')
# 定义级别,收集的是DEBUG以上的级别
my_logging.setLevel('DEBUG')
# 设置输出格式
formatter = logging.Formatter('%(asctime)s-%(levelname)s-%(filename)s-%(name)s-日志信息:%(message)s')
# 定义一个输出渠道:StreamHandler 输出到控制台(包括ERROR)
ch = logging.StreamHandler()
ch.setLevel('ERROR')
ch.setFormatter(formatter) # 加上输出格式
# FileHandler 输出到文本
fh = logging.FileHandler(r'E:wkprojectclass_api_towfhandler.txt', encoding='utf-8')
fh.setLevel('DEBUG')
fh.setFormatter(formatter) # 加上输出格式
# 把收集控制器和输出控制器连接起来 指定到输出渠道
my_logging.addHandler(ch)
my_logging.addHandler(fh)
# 收集信息
if level == 'DEBUG':
my_logging.debug(msg)
elif level == 'INFO':
my_logging.info(msg)
elif level == 'WARNING':
my_logging.warning(msg)
elif level == 'ERROR':
my_logging.error(msg)
elif level == 'CRITICAL':
my_logging.critical(msg)
# 关闭日志收集器
my_logging.removeHandler(ch)
my_logging.removeHandler(fh)
def debug(self, msg):
self.mylog(msg, 'DEBUG')
def info(self, msg):
self.mylog(msg, 'INFO')
def warning(self, msg):
self.mylog(msg, 'WARNING')
def error(self, msg):
self.mylog(msg, 'ERROR')
def critical(self, msg):
self.mylog(msg, 'CRITICAL')
if __name__ == '__main__':
my_logger = My_log() # 引用实例
my_logger.debug('昆山市')
my_logger.error('多少岁的')
my_logger.critical('啥大事')
最后是在实战中引用:
列如:
from class_api.class_chushi import Http_Ruests
import unittest
from class_api.class_demo_fanshe import GetData # 方案二
from ddt import ddt, data, unpack
from class_api_tow.doexcel import DoExcel
from learning_wk.login_class.login_wk import My_log
my_logger = My_log()
test_data = DoExcel.doexcel('test_data.xlsx')
@ddt
class Http_Requests(unittest.TestCase):
@data(*test_data)
def test_login_True(self, item):
res = Http_Ruests().login_requests(item['url'], eval(item['data']), item['method'], getattr(GetData, 'cookies'))
if res.cookies:
setattr(GetData, 'cookies', res.cookies) # 方案二
try:
self.assertEqual(str(item['expected']), res.json()['code'])
test_result = 'PASS'
except AssertionError as e:
test_result = 'failed'
my_logger.info("执行用例出错 {}".format(e)) # 打印在文件中,不输出到控制台
# print("执行用例出错 {}".format(e))
raise e
finally:
DoExcel.write_back('test_data.xlsx', item['sheet_name'], item['mode'] + 1, str(res.json()), test_result)
my_logger.error("获取到的结果是:{}".format(res.json())) # 如果有错误会输出到控制台
print(res.json())



