如何更改RotatingFileHandler在Python中命名文件的方式?

2024-05-16 20:44:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我想改变旋转文件处理程序命名文件的方式。在

例如,如果我使用RotatingFileHandler,它会在日志文件达到特定的文件大小时将其分离,命名为“日志文件名+扩展名编号”,如下所示。在

filename.log      #first log file
filename.log.1    #rotating log file1
filename.log.2    #rotating log file2

但是,我希望日志处理程序在每次创建时命名它们。 例如。在

^{pr2}$

我该怎么做?在

编辑:

我不是问如何创建和命名一个文件。在

我想帮助python logging包执行继承和重写{}之类的事情。在


Tags: 文件log处理程序文件名方式filename命名file1
2条回答

我继承并重写python日志处理程序的RotatingFileHandler。在

RotatingFileHandler具有self.baseFilename值,处理程序将使用self.baseFilename来创建日志文件。(当它首先创建文件或发生滚动时)

self.shouldRollover()方法,它检查处理程序是否应该滚动日志文件。在

如果此方法return 1,则表示应该发生滚动或{}。在

通过重写它们,我定义了这个处理程序何时进行rollover,以及rollover应该为新的日志文件使用哪个名称。在

-编辑-

我发布了示例代码。在

from logging import handlers

class DailyRotatingFileHandler(handlers.RotatingFileHandler):

    def __init__(self, alias, basedir, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0):
        """
        @summary: 
        Set self.baseFilename to date string of today.
        The handler create logFile named self.baseFilename
        """
        self.basedir_ = basedir
        self.alias_ = alias

        self.baseFilename = self.getBaseFilename()

        handlers.RotatingFileHandler.__init__(self, self.baseFilename, mode, maxBytes, backupCount, encoding, delay)

    def getBaseFilename(self):
        """
        @summary: Return logFile name string formatted to "today.log.alias"
        """
        self.today_ = datetime.date.today()
        basename_ = self.today_.strftime("%Y-%m-%d") + ".log" + '.' + self.alias_
        return os.path.join(self.basedir_, basename_)

    def shouldRollover(self, record):
        """
        @summary: 
        Rollover happen 
        1. When the logFile size is get over maxBytes.
        2. When date is changed.

        @see: BaseRotatingHandler.emit
        """

        if self.stream is None:                
            self.stream = self._open()

        if self.maxBytes > 0 :                  
            msg = "%s\n" % self.format(record)
            self.stream.seek(0, 2)  
            if self.stream.tell() + len(msg) >= self.maxBytes:
                return 1

        if self.today_ != datetime.date.today():
            self.baseFilename = self.getBaseFilename()
            return 1

        return 0

此DailyRotatingFileHandler将创建日志文件,如下所示

^{pr2}$

检查下面的代码,看看它是否有用。就我所能理解的,从你的问题,如果你的问题是实现基于时间戳的文件名,那么这将为你工作。在

import datetime, time
# This return the epoch timestamp    
epochTime = time.time()
# We generate the timestamp 
# as per the need
timeStamp = datetime.datetime\
                    .fromtimestamp(epochTime)\
                    .strftime('%Y-%m-%d-%H-%M')
# Create a log file 
# use timeStamp as filename
fo = open(timeStamp+".log", "wb")
fo.write("Log data")
fo.close()

相关问题 更多 >