import logging.handlers import os import queue from izihawa_types.var import varstr class QueueHandler(logging.handlers.QueueHandler): def __init__(self, *handlers): self._queue = queue.Queue(-1) self._listener = logging.handlers.QueueListener(self._queue, *handlers, respect_handler_level=True) self.setLevel('INFO') super().__init__(self._queue) self._listener.start() def stop(self): self._listener.stop() def prepare(self, record): return record class BaseFileHandler(logging.handlers.WatchedFileHandler): def _open(self): file = super()._open() os.chmod(self.baseFilename, 0o644) return file class BaseBinaryFileHandler(BaseFileHandler): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs, mode='ab+') def emit(self, record): try: self.stream.write(varstr(record.msg)) self.flush() except RecursionError: raise except Exception: self.handleError(record)