TimedRotatingFileHandler日志的文件名约定?(python)

TimedRotatingFileHandler日志的文件名约定?(python),python,Python,Python 2.7: 每次日志发生翻滚事件(使用RotatingFileHandler的日志)时,都会生成一个“备份”日志 例如: logFile = 'general.log' file_handler = logging.handlers.TimedRotatingFileHandler(logFile,when="midnight") 在午夜翻滚和翻滚事件中,将创建以下文件: general.log.2015-01-21 该模块是否提供了这些文件名的结构灵活性? 使用不同的约定201

Python 2.7: 每次日志发生翻滚事件(使用RotatingFileHandler的日志)时,都会生成一个“备份”日志

例如:

logFile = 'general.log'
file_handler = logging.handlers.TimedRotatingFileHandler(logFile,when="midnight")
在午夜翻滚和翻滚事件中,将创建以下文件:

general.log.2015-01-21
该模块是否提供了这些文件名的结构灵活性?
使用不同的约定<代码>20150121\u概述。日志

简短的回答是否定的:根据文档,您没有办法这样做

后缀根据
时的
参数进行更改,就像您在代码中看到的那样

从同一源代码中,您可以看到覆盖
后缀
很简单,但您也必须覆盖
extMatch

class MyTimedRotatingFileHandler(TimedRotatingFileHandler):
    def __init__(self, *args, **kwargs):
        super(MyTimedRotatingFileHandler,self).__init__(*args,**kwargs)
        self.suffix = "%Y%m%d"
        self.extMatch = re.compile(r"^\d{4}\d{2}\d{2}$")
不幸的是,替换点分隔符和交换
suffix
basename
并不是那么简单,您必须重写
doRollover()
getFilesToDelete()
方法

黑客可以是这样的(未经测试)。。。我希望它能起作用,但我不能给出任何保证:)

类MyTimedRotatingFileHandler(TimedRotatingFileHandler):
self.extMatch=r“^\d{4}-\d{2}-\d{2}$”
def getFilesToDelete(自):
“剪切、粘贴和…破解
"""
dirName,baseName=os.path.split(self.baseFilename)
filename=os.listdir(dirName)
结果=[]
extMatch=re.compile(r“^\d{4}\d{2}\d{2}$”)
ends=“389;”+baseName+”.log”
elen=len(结束)
对于文件名中的文件名:
如果文件名[-elen::]=结束:
日期=文件名[-elen:]
如果self.extMatch.match(日期):
result.append(os.path.join(dirName,fileName))
result.sort()
如果len(结果)0:
对于self.getFilesToDelete()中的s:
删除操作系统
如果不是自动延迟:
self.stream=self.\u open()
newRolloverAt=自计算机滚动(currentTime)

而newRolloverAt是否有前缀字段?否:(文件名是在中内置的
doRollover()
方法,并且代码不是为自定义而设计的。
class MyTimedRotatingFileHandler(TimedRotatingFileHandler):

        self.extMatch = r"^\d{4}-\d{2}-\d{2}$"

   def getFilesToDelete(self):
        """ CUT, PASTE AND .... HACK
        """
        dirName, baseName = os.path.split(self.baseFilename)
        fileNames = os.listdir(dirName)
        result = []
        extMatch = re.compile(r"^\d{4}\d{2}\d{2}$")
        ends = "_" + baseName + ".log"
        elen = len(ends)
        for fileName in fileNames:
            if fileName[-elen:] == ends:
                date = fileName[-elen:]
                if self.extMatch.match(date):
                    result.append(os.path.join(dirName, fileName))
        result.sort()
        if len(result) < self.backupCount:
            result = []
        else:
            result = result[:len(result) - self.backupCount]
        return result

    def doRollover(self):
        """
        CUT AND PAST FROM TimedRotatingFileHandler
        customize file name by prefix instead suffix
        """
        if self.stream:
            self.stream.close()
            self.stream = None
        # get the time that this sequence started at and make it a TimeTuple
        currentTime = int(time.time())
        dstNow = time.localtime(currentTime)[-1]
        t = self.rolloverAt - self.interval
        if self.utc:
            timeTuple = time.gmtime(t)
        else:
            timeTuple = time.localtime(t)
            dstThen = timeTuple[-1]
            if dstNow != dstThen:
                if dstNow:
                    addend = 3600
                else:
                    addend = -3600
                timeTuple = time.localtime(t + addend)
        #################################################
        # THE HACK!!!! ##################################
        ##################################################
        dfn = time.strftime("%Y%m%d", timeTuple) + "_" +self.baseFilename + ".log"
        if os.path.exists(dfn):
            os.remove(dfn)
        # Issue 18940: A file may not have been created if delay is True.
        if os.path.exists(self.baseFilename):
            os.rename(self.baseFilename, dfn)
        if self.backupCount > 0:
            for s in self.getFilesToDelete():
                os.remove(s)
        if not self.delay:
            self.stream = self._open()
        newRolloverAt = self.computeRollover(currentTime)
        while newRolloverAt <= currentTime:
            newRolloverAt = newRolloverAt + self.interval
        #If DST changes and midnight or weekly rollover, adjust for this.
        if (self.when == 'MIDNIGHT' or self.when.startswith('W')) and not self.utc:
            dstAtRollover = time.localtime(newRolloverAt)[-1]
            if dstNow != dstAtRollover:
                if not dstNow:  # DST kicks in before next rollover, so we need to deduct an hour
                    addend = -3600
                else:           # DST bows out before next rollover, so we need to add an hour
                    addend = 3600
                newRolloverAt += addend
        self.rolloverAt = newRolloverAt