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
所以,在阅读文档和几个 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