From 65a375573d7327391cb06e0b585a31739a551e70 Mon Sep 17 00:00:00 2001 From: "Olivier Wilkinson (reivilibre)" Date: Thu, 15 Jul 2021 19:26:40 +0100 Subject: [PATCH] Add PeriodicallyFlushingMemoryHandler --- synapse/logging/handlers.py | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 synapse/logging/handlers.py diff --git a/synapse/logging/handlers.py b/synapse/logging/handlers.py new file mode 100644 index 000000000000..67fc755631b1 --- /dev/null +++ b/synapse/logging/handlers.py @@ -0,0 +1,43 @@ +import logging +import time +from logging import Handler +from logging.handlers import MemoryHandler +from threading import Thread +from typing import Optional + + +class PeriodicallyFlushingMemoryHandler(MemoryHandler): + """ + This is a subclass of MemoryHandler which additionally spawns a background + thread which periodically flushes the buffers. + + This prevents messages from being buffered for too long. + """ + + def __init__( + self, + capacity: int, + flushLevel: int = logging.ERROR, + target: Optional[Handler] = None, + flushOnClose: bool = True, + period: float = 5.0, + ) -> None: + super().__init__(capacity, flushLevel, target, flushOnClose) + + self._flush_period: float = period + self._active: bool = True + + self._flushing_thread: Thread = Thread( + name="PeriodicallyFlushingMemoryHandler flushing thread", + target=self._flush_periodically, + ) + self._flushing_thread.start() + + def _flush_periodically(self): + while self._active: + self.flush() + time.sleep(self._flush_period) + + def close(self) -> None: + self._active = False + super().close()