Как создать основанный на времени BufferingHandler в Python? - PullRequest
1 голос
/ 19 июня 2019

Я хотел бы создать на основе времени BufferingHandler.В настоящее время BufferingHandler основан на capacity, что означает, что он будет сбрасывать записи только при достижении этого capacity, как видно из исходного кода :

class BufferingHandler(logging.Handler):
    def __init__(self, capacity):
        logging.Handler.__init__(self)
        self.capacity = capacity
        self.buffer = []

    def shouldFlush(self, record):
        return (len(self.buffer) >= self.capacity)

    def emit(self, record):
        self.buffer.append(record)
        if self.shouldFlush(record):
            self.flush()

    def flush(self):
        self.acquire()
        try:
            self.buffer = []
        finally:
            self.release()
    ...

Я попробовал:

class TimeBasedBufferingHandler(BufferingHandler):

    def __init__(self, capacity=10, delta=60):
        BufferingHandler.__init__(self)
        self.capacity = capacity
        self.delta = delta  # in seconds (as time.time())

    def shouldFlush(self, record):
        is_full = len(self.buffer) >= self.capacity
        is_old = (record.created - self.buffer[0].created) >= self.delta
        return is_full or is_old

Проблема в моем TimeBasedBufferingHandler заключается в том, что если после последней записи не было получено ни одной записи и shouldFlush не вернул True, некоторые журналы будуточень долго в ловушке в буфере, а это не то, что я хочу.Я все еще хочу выпустить журналы через некоторое время (например, delta), даже если не было получено ни одной записи для запуска функции emit.

Как я могу это сделать?

1 Ответ

1 голос
/ 19 июня 2019

Вы можете сами вызвать flush вручную, откуда угодно, когда вы хотите очистить буфер обработчика.Вы можете сделать это по таймеру, например, что-то вроде:

timeout = 60
handler = TimeBasedBufferingHandler(capacity=XXX, delta=timeout)
timer = threading.Timer(timeout, handler.flush)
...