自定义日志函数
1)日志基础
a)日志用于详细记录重要的步骤和操作,可供测试人员更好的调试脚本
b)日志可以输出到控制台、文件,也可以同时输出到控制台和文件
c)输出到控制台时,可以代替print
d)日志输出等级
日志等级由低到高分别是DEBUG、INFO、WARNING、ERROR、CRITICAL
CRITICAL:特别糟糕的事情,如内存耗尽,磁盘空间为空
ERROR:发生错误时,如IO操作失败或者连接问题
WARNING:发生很重要的事情,但并不是错误,是警告信息
INFO:处理请求或者状态变化等日常事务
DEBUG:调试过程中使用,如算法中每个循环的中间状态
设置日志输出等级后,凡是比指定等级高的日志均输出,比指定等级低的日志均不输出
2)日志输出到控制台步骤
导入模块logging:import logging
使用日志需要导入模块logging
创建日志对象: logger = logging.getLogger()
设置日志输出等级:logger.setLevel(logging.INFO)
等级INFO、WARNING、ERROR、CRITICAL的日志均会输出
设置日志输出格式:
formater = logging.Formatter('%(asctime)s-%(filename)s - %(lineno)d-%(message)s')
%s之间的内容全部是关键字,不能改变
asctime:当前时间(精确到ms)
filename:模块名
lineno:行号
levelname:日志等级
message:自定义消息
创建日志处理器:console=logging.SteamHandler() #输出控制台
用于设定日志输出到控制台
设置日志处理器的日志输出格式:console.setFormatter(formater)
当前时间 - 模块名 - 行号 - 日志等级 - 自定义日志消息
日志处理器增加到日志对象:logger.addHandler(console)
关闭日志处理器:logger.close()
3)使用日志
假设自定义的日志函数名 log
log().info('日志消息')
log().warning('日志消息')
log().error('日志消息')
log().critical('日志消息')
4)日志重复输出问题
原因是没有移除上一个日志处理器
logger=logging.getLogger()
若内存中已存在创建的对象,则不会重复创建
logger.addHandler(console)
将console添加到logger对象中
第1次输出日志时,第1个handler添加到logger中
第2次输出日志时,第2个handler添加到logger中,logger中有2个handler,传递的日志消息都是最新的、相同的,结果相同日志输出2次,依次类推
5)解决日志重复输出方案
如果logger.handlers列表为空,则添加日志处理器,否则直接去写日志
参考代码:
if not logger.handlers:
logger.setLevel(logging.INFO)
formatter = logging.Formatter(...)
console=logging.StreamHandler()
console.setFormatter(formatter)
logger.addHandler(console)
console.close()