You need to call .close()
on the filehandler.
When your Run
class completes, call:
handlers = self.log.handlers[:]
for handler in handlers:
self.log.removeHandler(handler)
handler.close()
A file handler will automatically re-open the configured filename every time a new log message arrives, so calling handler.close()
may sometimes appear futile. Removing the handler from the logger stops future log records from being sent to it; in the above code we do this first, to avoid an untimely log message from another thread reopening the handler.
Another answer here suggest you use logging.shutdown()
. However, all that logging.shutdown()
does is call handler.flush()
and handler.close()
, and I’d not recommend using it. It leaves the logging module in a state where you can’t use logging.shutdown()
again, not reliably.