两种方式实现日志模块调用

方式一:

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文件的绝对路径(完整路径)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值