2

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

有2个线程,它们永远不会停止。他们称此代码为(我知道 logger 已经是单例,实用程序中有更多不相关的代码):

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))
4

2 回答 2

3

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

这就是正在发生的事情: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()。它们在您的TimedRotatingFileHandlerhttps://github.com/python/cpython/blob/829b49cbd2e4b1d573470da79ca844b730120f3d/Lib/logging/handlers.py#L193)上定义并且非常简单。

于 2015-08-10T11:32:57.400 回答
0

重温旧问题,只需使用 loguru

于 2021-09-22T20:39:45.297 回答