import gzip from logging.handlers import RotatingFileHandler import shutil import os class GunZipRotatingFileHandler(RotatingFileHandler): def doRollover(self): if self.stream: self.stream.close() self.stream = None if self.backupCount > 0: # Rotate existing backup files for i in range(self.backupCount - 1, 0, -1): sfn = self.rotation_filename("%s.%d.gz" % (self.baseFilename, i)) dfn = self.rotation_filename("%s.%d.gz" % (self.baseFilename, i + 1)) if os.path.exists(sfn): if os.path.exists(dfn): os.remove(dfn) os.rename(sfn, dfn) # Compress current log file to .1.gz dfn = self.rotation_filename(self.baseFilename + ".1.gz") if os.path.exists(dfn): os.remove(dfn) if os.path.exists(self.baseFilename): with open(self.baseFilename, "rb") as f_in: with gzip.open(dfn, "wb") as f_out: shutil.copyfileobj(f_in, f_out) os.remove(self.baseFilename) if not self.delay: self.stream = self._open()