2

そのため、ドキュメントといくつかのスタックオーバーフローの質問を読んで、Python 3.4 で試してみたところ、わかりませんでした。いつ、どのような条件で回転しますか?

2 つのスレッドがあり、停止することはありません。彼らはこのコードを呼び出します(私はロガーがすでにシングルトンであることを知っています、ユーティリティにはもっと無関係なコードがあります):

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

私が見る限り、ローテーションは新しいエントリがログに記録された場合にのみ発生します (まあ、それは理にかなっていますよね?)。

そして、これが起こっていることです:(あなたの場合はhttps://github.com/python/cpython/blob/829b49cbd2e4b1d573470da79ca844b730120f3d/Lib/logging/handlers.py#L63log()の)呼び出しhandle()ます:emit()BaseRotatingHandler

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)

したがって、回転には と の 2 つの方法があることがわかりshouldRollover()ますdoRollover()。それらはあなたTimedRotatingFileHandler( https://github.com/python/cpython/blob/829b49cbd2e4b1d573470da79ca844b730120f3d/Lib/logging/handlers.py#L193 ) で定義されており、非常に簡単です。

于 2015-08-10T11:32:57.400 に答える