python logging 使用封装

自己对python logging 模块进行了封装,主要实现了以下功能,代码可以直接使用,logging的细节就不赘述了

1、单例模式调用日志Singleton
2、设置控制台打印日志setBasic(不设置不会在输出窗口打印)
3、添加普通日志addLogHandle
4、添加按文件大小可回滚日志addRotatingLogHandle
5、添加按时间生成可回滚日志TimedRotatingFileHandler

这几个基本就够用了,下面是具体代码实现(mylog.py):

import logging, logging.handlers


ONE_FILE_MAX_SIZE = 4 * 1024 * 1024    #单个文件的最大容量
MAX_FILE_COUNT = 100      #日志回滚时默认的最大日志文件个数


class MySingletonLog():
    __singleton = None
    def __init__(self):
        pass

    def init(self, level = logging.DEBUG):
        self.logger = logging.getLogger()
        self.logger.setLevel(level)
        self.format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s'
        self.formatter = logging.Formatter(self.format)

    def setBasic(self, level = logging.DEBUG):
        '''
        设置控制台显示
        '''
        logging.basicConfig(level = level, format = self.format)

    def addLogHandle(self, fileName, level = logging.DEBUG):
        '''
        添加普通类型日志文件
        '''
        fileHandle = logging.FileHandler(fileName)
        fileHandle.setFormatter(self.formatter)
        fileHandle.setLevel(level)
        self.logger.addHandler(fileHandle)

    def addRotatingLogHandle(self, fileName, level = logging.DEBUG, size = ONE_FILE_MAX_SIZE, count = MAX_FILE_COUNT):
        '''
        添加按文件大小和个数回滚类型日志文件
        fileName:文件名称
        level:保存日志的等级
        oneFileMaxSize:单个文件的最大容量
        maxFileCount:保留日志文件个数
        '''
        fileHandle = logging.handlers.RotatingFileHandler(fileName, maxBytes=size, backupCount=count)
        fileHandle.setFormatter(self.formatter)
        fileHandle.setLevel(level)
        self.logger.addHandler(fileHandle)

    def addTimeRotatingLogHandle(self, fileName, level = logging.DEBUG, timeSpan="M", timeWhen=2, count = MAX_FILE_COUNT):
        '''
        添加按日期回滚类型日志文件
        fileName:输出日志的文件名称前缀
        level:保存日志的等级
        timeSpan:日志切分的间隔时间,经过timeSpan的时间产生一个新的文件
        timeWhen:是指等待多少个单位when的时间后,Logger会自动重建文件
        maxFileCount:保留日志文件个数
        '''
        fileHandle = logging.handlers.TimedRotatingFileHandler(fileName, when=timeSpan, interval=timeWhen, backupCount=count)
        fileHandle.setFormatter(self.formatter)
        fileHandle.setLevel(level)
        self.logger.addHandler(fileHandle)

    @staticmethod
    def Singleton(level = logging.DEBUG):
        #单例模式
        if MySingletonLog.__singleton == None:
            MySingletonLog.__singleton = MySingletonLog()
            MySingletonLog.__singleton.init(level)

        return MySingletonLog.__singleton

以下是测试代码,分别对各接口进行了调用,生成日志文件(logTest.py):

import logging
import time
from mylog import MySingletonLog


logSingleton = MySingletonLog.Singleton(logging.DEBUG)

logSingleton.setBasic()#命令行打印

#添加普通日志,会一直记录
logSingleton.addLogHandle('./normal.log')

#添加按文件大小回滚日志,日志大小为1000Byte,允许回滚10个文件
logSingleton.addRotatingLogHandle('./rotat.log', size = 10000, count = 10)

#按时间回滚日志,允许回滚10个文件
logSingleton.addTimeRotatingLogHandle('./timeRotat.log', count = 10)

count = 0
while True:
    time.sleep(0.1)
    count = count + 1
    logging.debug('test rotation log-----------' + str(count))

以下是日志文件截图,测试没有发现问题。
在这里插入图片描述


版权声明:本文为weixin_43989195原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。