方式一:
1.封装日志模块并调用,read_log
代码示例:
import logging
import time
import colorlog
import logging.handlers
# 控制台输出日志颜色设置
colors_log = {
'DEBUG': 'white',
'INFO': 'cyan',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'bold_red',
}
class Log(object):
now = time.strftime("%Y-%m-%d") # 打印当前时间
def __init__(self,name=__name__,path='D:\\自动化测试\\apitest_pycharm\\report\\'+now+' AllLog.log',
error_path='D:\\自动化测试\\apitest_pycharm\\report\\'+now+' error.log',level='DEBUG'):
""""设置文件保存地址、名称、日志等级"""
self.name=name
self.path=path
self.error_path=error_path
self.level=level
# 创建Logger 设置默认日志的级别,CRITICAL/ERROR/WARNING/INFO/DEBUG/NOTSET
self.logger = logging.getLogger()
self.logger.setLevel(self.level)
def ini_handler(self):
"""初始化handler"""
stream_handler=logging.StreamHandler()#控制台日志输出
AllLog_handler=logging.FileHandler(self.path,mode='a',encoding='utf-8')#AllLog日志文件输出
error_handler=logging.FileHandler(self.error_path,mode='a',encoding='utf-8')#error错误日志文件输出
#S/M/H/D/W/0,秒/分/时/周/月,when='M',interval=1表示:每分钟产生一个日志文件,backupCount:日志文件保留个数
log_file_handler=logging.handlers.TimedRotatingFileHandler(filename=self.path,when='D',interval=1,backupCount=2,
encoding='utf-8')
log_file_handler2=logging.handlers.TimedRotatingFileHandler(filename=self.error_path,when='D',interval=1,backupCount=2,
encoding='utf-8')
return stream_handler,AllLog_handler,error_handler,log_file_handler,log_file_handler2
def set_handler(self,stream_handler,AllLog_handler,error_handler,log_file_handler,log_file_handler2,level_1='ERROR'):
"""设置handler级别并添加到logger收集器"""
stream_handler.setLevel(self.level)#控制台日志级别设置
AllLog_handler.setLevel(level_1)#AllLog日志级别设置
error_handler.setLevel(self.level)#error日志级别设置
#log_file_handler2.setLevel(level_1)
self.logger.addHandler(stream_handler)#输出到控制台
self.logger.addHandler(AllLog_handler)#输出到文件
self.logger.addHandler(log_file_handler)
self.logger.addHandler(error_handler)
self.logger.addHandler(log_file_handler2)
def set_formatter(self,stream_handler,AllLog_handler,error_handler):
""""设置日志输出格式"""
#设置控制台输出格式、区分级别颜色
formatter1 = colorlog.ColoredFormatter('%(log_color)s%(asctime)s-<%(filename)s> line:%(lineno)d'
'-%(levelname)s-[日志信息]: %(message)s',
datefmt='%a,%d %b %Y %H:%M:%S',
log_colors=colors_log)
#设置文件日志格式
formatter = logging.Formatter('%(asctime)s-<%(filename)s> line:%(lineno)d'
'-%(levelname)s-[日志信息]: %(message)s',
datefmt='%a,%d %b %Y %H:%M:%S')
stream_handler.setFormatter(formatter1)#指定控制台格式
AllLog_handler.setFormatter(formatter)#指定文件格式
error_handler.setFormatter(formatter)
def close_handler(self,stream_handler,AllLog_handler,error_handler):
"""关闭handler"""
stream_handler.close()
AllLog_handler.close()
error_handler.close()
@property#把一个方法变成属性调用,只能有一个参数self;不能和别的类属性同名;并且在调用时不需要加()
def get_Logger(self):
"""构造收集器,返回logger"""
stream_handler,error_handler,AllLog_handler,log_file_handler,log_file_handler2=self.ini_handler()
self.set_handler(stream_handler,AllLog_handler,error_handler,log_file_handler,log_file_handler2)
self.set_formatter(stream_handler,AllLog_handler,error_handler)
self.close_handler(stream_handler,AllLog_handler,error_handler)
return self.logger
if __name__=='__main__':
log = Log(__name__)
logger= log.get_Logger
logger.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
logger.info('info级别,正常输出信息,一般用来打印一些正常的操作')
logger.warning('warning级别,一般用来打印警告信息')
logger.error('error级别,一般用来打印错误信息')
logger.critical('critical级别,一般用来打印致命错误信息,等级最高')
封装后的logging代码中format()中的自定义日志格式,可以根据喜好更换:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
when:是一个字符串,用于描述滚动周期的基本单位,字符串的值及意义如下:
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
interval: 滚动周期,单位有when指定,比如:when=’D’,interval=1,表示每天产生一个日志文件;
backupCount: 表示日志文件的保留个数;
2.在实际中调用日志模块,例如:
方式二:
1.调用日志模块config xxx.ini/xxx.config
代码如下:
#文件必须包含名为[loggers],[handlers],[formatters]的节
#创建3个APP名,root是父类必须存在
[loggers]
keys=root,example01,example02
#根logger必须指点级别跟handler列表,level可以是DEBUG, INFO, WARNING, ERROR, CRITICAL 或 NOTSET其中之一。
#定义规则,设置过滤器
[logger_root]
level=DEBUG
handlers=hand01,hand02
#定义打印输出的APP名
[logger_example01]
handlers=hand01,hand02
qualname=example01
propagate=0
#定义打印输出的APP名
[logger_example02]
handlers=hand01,hand03
qualname=example02
propagate=0
#定义过滤器名称
[handlers]
keys=hand01,hand02,hand03
#日志输出到控制台、定义级别、日志格式
[handler_hand01]
class=StreamHandler
level=DEBUG
formatter=form01
args=(sys.stdout, )
#日志输出到文件
[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form01
args=('D:/自动化测试/apitest_pycharm/report/test_case_log.log','a')
#日志大小回滚,文件名、读写方式、文件大小、保存个数
[handler_hand03]
class=handlers.RotatingFileHandler
level=INFO
formatter=form01
args=('D:/自动化测试/apitest_pycharm/report/test_case_log.log','a',10*1024*1024,3)
#定义格式名称
[formatters]
keys=form01,form02
#配置输出内容格式
[formatter_form01]
format=%(asctime)s-<%(filename)s> line:%(lineno)d-%(levelname)s-[日志信息]: %(message)s
datefmt=%a,%d %b %Y %H:%M:%S
#配置输出内容格式
[formatter_form02]
format=%(name)-12s:%(levelname)s-8s-[日志信息]: %(message)s
datefmt=%a,%d %b %Y %H:%M:%S
2.调用日志模块封装,read_log_setting
代码如下:
from os import path
print(path.dirname(__file__))#打印路径
class MyLog(object):
def __init__(self):
#结合read_log_setting.py文件的路径+log_setting.ini文件
log_path_file=path.join(path.dirname(path.abspath(__file__)),'log_setting.ini')
print(log_path_file)
config.fileConfig(log_path_file) #读取对应配置文件
self.logger = logging.getLogger('example01')#获取对应APP名称
@property #把一个方法变成属性调用,只能有一个参数self;不能和别的类属性同名;并且在调用时不需要加()
def mylogger(self):
return self.logger
if __name__ == '__main__':
log= MyLog().mylogger
log.info('it is my test log message info')
log.debug('it is my test log message debug')
log.warning('warning级别,一般用来打印警告信息')
log.error('error级别,一般用来打印错误信息')
log.critical('critical级别,一般用来打印致命错误信息,等级最高')
3.在用例中调用:
os.path.dirname(file)返回的是.py文件的目录
os.path.abspath(file)返回的是.py文件的绝对路径(完整路径)