Implement TimeoutSwitchingFileHandler
This commit is contained in:
commit
7d8bcbd5bf
|
@ -0,0 +1,13 @@
|
||||||
|
TimeoutSwitchingFileHandler
|
||||||
|
===========================
|
||||||
|
|
||||||
|
This is a logging file handler for the Python logging system.
|
||||||
|
It automatically closes the log file after a period of inactivity
|
||||||
|
(or after the file has been open for some time whichever comes first)
|
||||||
|
and then opens a new file at the next emit.
|
||||||
|
|
||||||
|
This is useful for long-running processes where short periods of
|
||||||
|
activity alternate with periods of inactivity. Log switchs will
|
||||||
|
typically occur during inactivity, so each log file will include one
|
||||||
|
complete active period. Also, since the log files are closed, they can
|
||||||
|
be safely compressed or removed.
|
|
@ -0,0 +1,42 @@
|
||||||
|
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()
|
Loading…
Reference in New Issue