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

San*_*Kim 7 python logging

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

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

filename.log      #first log file
filename.log.1    #rotating log file1
filename.log.2    #rotating log file2
Run Code Online (Sandbox Code Playgroud)

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

09-01-12-20.log    #first log file
09-01-12-43.log    #rotating log file1
09-01-15-00.log    #rotating log file2
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑:

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

我想促进 pythonlogging包做一些类似继承和覆盖的事情logging

San*_*Kim 7

我继承并覆盖RotatingFileHandler了 python 日志处理程序。

RotatingFileHandler 有self.baseFilename值,处理程序将用于self.baseFilename创建日志文件。(当它首先创建文件或发生翻转时)

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

如果采用这种方法return 1,则表示应该发生翻转或return 0

通过覆盖它们,我定义了此处理程序何时进行翻转以及翻转时应为新日志文件使用哪个名称。

- - - - - - - - - - - - - - - - - - - - -编辑 - - - - ---------------------------------

我发布了示例代码。

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
Run Code Online (Sandbox Code Playgroud)

这个 DailyRotatingFileHandler 将创建日志文件,如

2016-10-05.log.alias
2016-10-05.log.alias.1
2016-10-05.log.alias.2
2016-10-06.log.alias
2016-10-06.log.alias.1
2016-10-07.log.alias.1
Run Code Online (Sandbox Code Playgroud)