43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
|
import logging
|
||
|
import threading
|
||
|
import time
|
||
|
|
||
|
class TimeoutSwitchingFileHandler(logging.Handler):
|
||
|
def __init__(self, filename, min_timeout=60, max_timeout=3600):
|
||
|
super().__init__()
|
||
|
self.basename = filename
|
||
|
self.min_timeout = min_timeout
|
||
|
self.max_timeout = max_timeout
|
||
|
self.fh = None
|
||
|
self.last_emit = 0
|
||
|
self.first_emit = 0
|
||
|
self.last_emit = 0
|
||
|
cleanup = threading.Thread(target=self.cleanup_loop, daemon=True)
|
||
|
cleanup.start()
|
||
|
|
||
|
def emit(self, record):
|
||
|
msg = self.format(record)
|
||
|
now = time.time()
|
||
|
if not self.fh:
|
||
|
now_tm = time.localtime(now)
|
||
|
filename = self.basename + time.strftime("%Y-%m-%d-%H-%M-%S", now_tm) + "-%06d" % (now % 1 * 1000000) + ".log"
|
||
|
self.fh = open(filename, "a")
|
||
|
self.first_emit = now
|
||
|
self.fh.write(msg)
|
||
|
self.fh.write("\n")
|
||
|
self.fh.flush()
|
||
|
self.last_emit = now
|
||
|
|
||
|
def cleanup_loop(self):
|
||
|
while True:
|
||
|
time.sleep(1)
|
||
|
self.acquire()
|
||
|
now = time.time()
|
||
|
if self.fh and now - self.last_emit > self.min_timeout:
|
||
|
self.fh.close()
|
||
|
self.fh = None
|
||
|
if self.fh and now - self.first_emit > self.max_timeout:
|
||
|
self.fh.close()
|
||
|
self.fh = None
|
||
|
self.release()
|