如何在 python 中创建基于时间的 BufferingHandler?

How to create a time-based BufferingHandler in python?

我想创建一个基于时间的BufferingHandler。目前,BufferingHandler 是基于 capacity,这意味着它只会在达到 capacity 时刷新记录,如 source code:[=23= 中所示]

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没有return True,一些日志将被捕获在缓冲区中放置很长时间,这不是我想要的。即使没有收到触发 emit 函数的记录,我仍然想在一段时间后(比如 delta)释放日志。

我该怎么做?

当您想要刷新处理程序的缓冲区时,您可以从任何地方手动调用 flush。您可以在计时器上执行此操作,例如:

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