代码之家  ›  专栏  ›  技术社区  ›  okkhoy

python rotatingfilehandler似乎没有旋转日志

  •  1
  • okkhoy  · 技术社区  · 6 年前

    我用以下代码设置了一个记录器:

    log = logging.getLogger('base')
    logfilename =  <path to logfile>
    logFile = logging.FileHandler(logfilename)
    log.setLevel(debug)
    logFile.setFormatter(logging.Formatter('[%(asctime)s]: [%(filename)s:%(lineno)d:%(funcName)s]: %(levelname)s :: %(message)s', datefmt='%m-%d-%Y %H:%M:%S'))
    log.addHandler(logFile)
    

    由于日志文件很大,我想创建一个旋转日志文件。 因此,我做了以下更改:

    # logFile = logging.FileHandler(logfilename)
    logFile = RotatingFileHandler(logfilename, maxBytes=1024)  # maxBytes=1024 only for testing
    

    但是,生成的日志文件不会旋转。我仍然得到几兆字节大的日志。我已经把所有的 .pyc 文件夹。

    问题:

    1. 是否需要指定备份计数(我需要保留所有日志!)因此,如果这是强制性的,我必须给出一些非常大的数字)。
    2. 通过 maxBytes 我假设它是实际的字节(因此在我的例子中,日志应该每1kb旋转一次)而不是其他的。我说的对吗?
    3. 有最低限度的 最大字节 低于哪个旋转无效?(我想不是)

    我使用python 2.7.14(anaconda)和3.6.4(anaconda)。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Martijn Pieters    6 年前

    你需要设定一个 backupCount 价值, 将文件模式从附加改为打开时截断。

    日志文件 关闭,但是 重新打开以便追加 ,所以你永远看不到真正的区别。

    现在发生的是:

    • 处理程序将测试当前文件长度加上消息是否使文件长度超过最大值。
      • 如果长度超过最大值,请关闭文件
      • 如果 备份计数 大于零,旋转任何现有备份文件,然后重命名日志文件以添加 .1
      • 打开要追加的日志文件。如果已经存在同名的文件,则该文件将重新打开。
    • 将消息写入打开的日志文件。

    除了设置 备份计数 对于大于0的数字,也可以将 mode 参数到 'w' ,此时您会发现文件是 截断的 每次都会变得太大:

    # 'rotate' logfile by truncating:
    logFile = RotatingFileHandler(logfilename, mode='w', maxBytes=1024)
    

    请注意,文件仍可能大于 maxBytes ,如果新消息本身的长度大于1024字节。

    没有保留的选择 全部的 旋转文件。你得用一个非常高的数字, 使用不同的文件旋转策略。例如, TimedRotatingFileHandler 在给定时间间隔后旋转文件,如果离开 备份计数 在0时,它永远不会删除旋转备份。

    你也可以将 RotatingFileHandler() 实现自己的重命名策略,提供自己的 doRollover() 方法。如果要保留所有备份,则需要生成唯一的名称;可以添加uuid以确保这一点(连同日期):

    import uuid
    from datetime import datetime
    from logging import RotatingFileHandler
    
    class InfiniteRotatingFileHandler(RotatingFileHandler):
        def doRollover(self):
            if self.stream:
                self.stream.close()
                self.stream = None
            new_name = '{}.{:%Y%m%d%H%M%S}.{}'.format(
                self.baseFilename, datetime.now(), uuid.uuid4())
            self.rotate(self.baseFilename, new_name)
            if not self.delay:
                self.stream = self._open()
    
        2
  •  1
  •   Ofer Sadan    6 年前

    docs :

    如果maxbytes或backupcount中的任何一个为零,则不会发生翻转, 所以您通常希望将backupcount设置为至少1,并且 非零最大字节数。

    也就是说没有设置 backupCount (默认值为0)没有任何滚动更新功能

    我需要保留所有日志!因此,如果这是强制性的,我必须 相当大的数目

    对!设置一个非常大的数字,然后每隔一段时间添加一个脚本来备份旧文件