如何更改Python中Rot​​atingFileHandler命名文件的方式? [英] How do I change the way that the RotatingFileHandler names files in Python?

查看:58
本文介绍了如何更改Python中Rot​​atingFileHandler命名文件的方式?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to change the way that the rotating file handler names files.

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

For example, if I use RotatingFileHandler, it separates the log file when it reaches a specific file size naming "log file name + extension numbering", like below.

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

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

However, I want the log handler to name them every time it is created. For example.

09-01-12-20.log    #first log file
09-01-12-43.log    #rotating log file1
09-01-15-00.log    #rotating log file2

我该怎么做?

我没有问如何创建和命名文件.

I am not asking how to create and name a file.

我想促进python logging包的工作,例如继承和覆盖logging.

I want to facilitate python logging package doing something like inheriting and overriding logging.

推荐答案

我继承并覆盖python日志记录处理程序的RotatingFileHandler.

I inherit and override RotatingFileHandler of python logging handler.

RotatingFileHandler的值为self.baseFilename,处理程序将使用self.baseFilename创建logFile.(当它首先创建文件时或发生翻转时)

RotatingFileHandler has self.baseFilename value, the handler will use self.baseFilename to create logFile.(when it creates file first or when rollover happens)

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

self.shouldRollover() method, It checks if the handler should rollover logfile or not.

如果此方法为return 1,则表示应该发生翻转或return 0.

If this method return 1, it means rollover should happen or return 0.

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

By overriding them, I define when this handler makes rollover and which name should be used for new log file by 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将创建类似的日志文件

This DailyRotatingFileHandler will create logfile like

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

这篇关于如何更改Python中Rot​​atingFileHandler命名文件的方式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆