logging模块的日志级别:日志级别一共有5个从低到高如下, 作用是在当你给python函数赋予日志器时, 需要自己标记日志级别(后面会用到)
debug(调试级别):严重程度最低级别,详细程度最高的日志信息,常用于问题诊断
info(轻微级别):严重程度仅次于DEBUG,信息详细程度也仅次于DEBUG,通常只记录关键节点信息,用于确认一切是否按照我们预期的那样进行工作
warning(警告级别):当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
error(错误级别):由于一个更严重的问题导致某些功能不能正常运行时记录的信息
critical(严重错误级别):当发生严重错误,导致应用程序不能继续运行时记录的信息
python-logging四大组件:
logger:日志器, 提供应用程序代码直接使用的接口
handler:处理器,用于将日志记录发送到指定的目的位置
formater:格式器, 用于定义日志信息的输出格式
filter:过滤器, 过滤日志内容
编写第一个日志器:
import logging
# 创建日志器: logging_name(日志器名,可以随便写),一个日志器可以有多个处理器, 并且每个处理器都可以有自己不同的格式器及过滤器
logger = logging.getLogger('logging_name')
# 设置日志输出等级,如果不设置则默认warning级别,也就是只有日志级别为warning或则以上时,才会打印日志,否则不会打印,一般来说需要设置成 debug 打印全部级别
logger.setLevel(logging.DEBUG)
# 创建处理器:
sh = logging.StreamHandler()
# 创建格式器: 日志时间%(asctime)s、文件名%(filename)s、行%(lineno)d、日志级别%(levelname)s、事件内容%(message)s
ft = logging.Formatter(fmt='日志时间: %(asctime)s\n文件名: %(filename)s 在第%(lineno)d行\n日志级别: %(levelname)s\n事件内容: %('
'message)s\n', datefmt='%Y年%m月%d日 %X')
# 在日志器中添加处理器
logger.addHandler(sh)
# 将设置好的格式器添加到处理器中
sh.setFormatter(ft)
# 输出日志信息,事件内容需要自己写,这条代码放在哪个文件, 错误定位就会显示在哪个文件
logger.debug('事件内容')
执行结果>>>
日志时间: 2023年02月05日 17:52:25
文件名: test_003.py 在第23行
日志级别: DEBUG
事件内容: 事件内容
上面说明了日志器的简单创建, 下面演示如何将日志器融入到自动化中
首先得将上面这个“线形日志器”封装一下,如下, 我将它封装到一个类中,然后将输出日志那行代码拿掉, 否则错误就会永远定位在日志函数文件。
import logging
class Log:
def getlog(self):
# 创建日志器: logging_name(日志器名,可以随便写),一个日志器可以有多个处理器, 并且每个处理器都可以有自己不同的格式器及过滤器
logger = logging.getLogger('logging_name')
# 设置日志输出等级,如果不设置则默认warning级别,也就是只有日志级别为warning或则以上时,才会打印日志,否则不会打印,一般来说需要设置成 debug 打印全部级别
logger.setLevel(logging.DEBUG)
# 创建处理器:
sh = logging.StreamHandler()
# 创建格式器: 日志时间%(asctime)s、文件名%(filename)s、行%(lineno)d、日志级别%(levelname)s、事件内容%(message)s
ft = logging.Formatter(fmt='日志时间: %(asctime)s\n文件名: %(filename)s 在第%(lineno)d行\n日志级别: %(levelname)s\n事件内容: %('
'message)s\n', datefmt='%Y年%m月%d日 %X')
# 在日志器中添加处理器
logger.addHandler(sh)
# 将设置好的格式器添加到处理器中
sh.setFormatter(ft)
return logger
如下, 我又定义了一个测试用例和一个公用函数
def comparison(da):
if da in '中文':
return '函数执行成功,是中文'
# 测试模块
class TestC:
# 测试用例
def test001(self):
print(comparison(1))
TestC().test001()
comparison ,公用函数的功能就是输入“中文”就可以执行成功, 输入数字就会报错
def comparison(da):
if da in '中文':
return '函数执行成功,是中文'
# 测试模块
class TestC:
# 测试用例
def test001(self):
print(comparison(1))
TestC().test001()
我的想法很简单,就是想把日志器加入到 comparison 函数中,如果报错了,我希望知道它的报错时间、报错文件、报错所在行,报错级别、报错内容。成功的话我也需要知道它的时间、文件、行、级别、内容。如何实现?很简单,将公用函数改造一下即可,如下
# 首先将日志类函数导入
from test_001 import Log
def comparison(da):
try:
if da in '中文':
# 成功的情况
Log().getlog().info(f'正在执行 comparison 函数,暂无错误,对比值为{da}:中文')
return '函数执行成功,是中文'
except Exception:
# 报错的情况
Log().getlog().error(f'正在执行 comparison 函数,类型对比错误,对比值为{da}:中文')
# 测试模块
class TestC:
# 测试用例
def test001(self):
comparison(1)
TestC().test001()
执行结果>>>
日志时间: 2023年02月05日 17:49:29
文件名: test_002.py 在第13行
日志级别: ERROR
事件内容: 正在执行 comparison 函数,类型对比错误,对比值为1:中文
logging-日志写入txt文件
如下,唯一变动的是标记橙色那一块代码
import logging
class Log:
# 日志器
def getlog(self, log_path):
"""
:param log_path: 日志输入文件所在路径,建议文件以txt格式,如果文件不存在则自动新建
:return:
"""
# 创建日志器: logging_name(日志器名,可以随便写)
logger = logging.getLogger('logging_name')
# 过滤器:设置日志输出等级
logger.setLevel(logging.DEBUG)
# 创建格式器: 日志时间%(asctime)s、文件名%(filename)s、行%(lineno)d、日志级别%(levelname)s、事件内容%(message)s
ft = logging.Formatter(fmt='日志时间: %(asctime)s\n文件名: %(filename)s 在第%(lineno)d行\n日志级别: %(levelname)s\n事件内容: %('
'message)s\n', datefmt='%Y年%m月%d日 %X')
# 设置文件格式
handler = logging.FileHandler(log_path, encoding='UTF-8')
handler.setFormatter(ft)
# 在日志器中添加处理器
logger.addHandler(handler)
# 将日志输出器返回。logger日志器、log_level日志级别、content日志内容
return logger
怎么使用呢?如下,橙色变动部分
# 首先将日志类函数导入
from test_001 import Log
def comparison(da):
try:
if da in '中文':
# log.txt:日志文件的路径,如果过没有该文件则自动新增
Log().getlog('log.txt').debug(f'正在执行 comparison 函数,暂无错误,对比值为{da}:中文')
return '函数执行成功,是中文'
except Exception:
# log.txt:日志文件的路径,如果过没有该文件则自动新增
Log().getlog('log.txt').debug(f'正在执行 comparison 函数,类型错误,对比值为{da}:中文')
# 测试模块
class TestC:
# 测试用例
def test001(self):
comparison(1)
TestC().test001()
执行之后, 控制台是没有日志输出内容的,内容被输出到了log.txt文件中,如下。
总结:
以上就是对日志模块- logging 的使用说明, 日志模块难点不是在代码, 而是日志设置点, 也就是在哪里将日志植入才是最好的, 日志器的植入函数最好是公用的,以及最容易报错的地方,就像监控摄像头安装最容易出事的地方,出现问题后才能最快去定位。
其实我在项目中,日志写入文件这个功能一般不用,直接在控制台输入显示就行了,如果有某条用例执行失败,我们一般都是先看测试报告,然后再单独执行失败的用例, 在去调试。因为测试框架是自己设置的,一报错看控制台就知道是哪里的原因。那什么情况下会用到日志呢? 当你的框架有很多人使用时,或者有不太熟悉接口框架的同事用的时候, 报错他们一般不知道是哪里报错,这时他们就会看日志报告,但是前提下你的日志得完善很好才行,不然他们也不知道哪里有问题
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!
涵盖以下这些面试题板块:
1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux
6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础
资料获取方式 :