Python TimedRotatingFileHandler 旋转是如何发生的

Python TimedRotatingFileHandler how does rotation happen

所以,在阅读文档和几个 Whosebug 问题并在 Python 3.4 中尝试后,我不明白。它什么时候旋转,在什么条件下旋转?

有 2 个线程,它们从不停止。他们调用这段代码(我知道 logger 已经是单例了,Utility 中有更多不相关的代码):

import logging
from singleton import Singleton
from logging.handlers import TimedRotatingFileHandler

class Utility(metaclass=Singleton):

    def _logger(self):
        logger = logging.getLogger("main")
        logger.setLevel(logging.INFO)
        if not logger.hasHandlers():
            handler = TimedRotatingFileHandler(
                filename = "info.log",
                when = 's',
                interval = 10,
                backupCount = 10,
                encoding = 'utf-8'
            )
            logger.addHandler(handler)
        return logger

    def log(self, *text):
        self._logger().info(' '.join(str(t) for t in text))

据我所知,只有在记录了新条目时才会发生轮换(好吧,这是有道理的,不是吗?)。

这就是正在发生的事情:log() 调用 handle() 调用 emit()BaseRotatingHandler 在你的情况下 https://github.com/python/cpython/blob/829b49cbd2e4b1d573470da79ca844b730120f3d/Lib/logging/handlers.py#L63):

def emit(self, record):
    """
    Emit a record.
    Output the record to the file, catering for rollover as described
    in doRollover().
    """
    try:
        if self.shouldRollover(record):
            self.doRollover()
        logging.FileHandler.emit(self, record)
    except Exception:
        self.handleError(record)

所以可以看到涉及轮换的方法有两种:shouldRollover()doRollover()。它们在您的 TimedRotatingFileHandler (https://github.com/python/cpython/blob/829b49cbd2e4b1d573470da79ca844b730120f3d/Lib/logging/handlers.py#L193) 上定义并且非常简单。

重温老问题,就用loguru