自己对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))
以下是日志文件截图,测试没有发现问题。