如何在 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)
我想创建一个基于时间的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)