The accepted answer will only archive 1 file- (basefile.log.1). Other files are not archived. This code will archive all log files except the main file.
import os import gzip import logging.handlers class NewRotatingFileHandler(logging.handlers.RotatingFileHandler): def __init__(self, filename, **kws): backupCount = kws.get('backupCount', 0) self.backup_count = backupCount logging.handlers.RotatingFileHandler.__init__(self, filename, **kws) def doArchive(self, old_log): with open(old_log) as log: with gzip.open(old_log + '.gz', 'wb') as comp_log: comp_log.writelines(log) os.remove(old_log) def doRollover(self): if self.stream: self.stream.close() self.stream = None if self.backup_count > 0: for i in range(self.backup_count - 1, 0, -1): sfn = "%s.%d.gz" % (self.baseFilename, i) dfn = "%s.%d.gz" % (self.baseFilename, i + 1) if os.path.exists(sfn): if os.path.exists(dfn): os.remove(dfn) os.rename(sfn, dfn) dfn = self.baseFilename + ".1" if os.path.exists(dfn): os.remove(dfn) if os.path.exists(self.baseFilename): os.rename(self.baseFilename, dfn) self.doArchive(dfn) if not self.delay: self.stream = self._open()
source share