2024-05-12 13:08:24 发布
网友
我正在使用Python中的standart logger库。有RotatingFileHandler,例如,它可以每天旋转日志文件。
但它只是重新命名。如果它不仅可以重命名,还可以将旧文件放入zip(或gz、bzip等)存档,那就太好了。
有什么简单的方法可以做到这一点吗?
接受的答案将只存档一个文件-(basefile.log.1)。其他文件不存档。 此代码将存档除基本文件以外的所有日志文件。
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()
通过使用encoding='bz2-codec'初始化RotatingFileHandler,可以自动写入bz2压缩日志文件:
encoding='bz2-codec'
RotatingFileHandler
import logging import logging.handlers as handlers if __name__=='__main__': log_filename='log_rotate.bz2' logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) handler = handlers.RotatingFileHandler( log_filename, maxBytes=20, backupCount=5, encoding='bz2-codec') logger.addHandler(handler) for i in range(20): logger.debug('i = %d' % i)
PS.Python3 removed 'bz2-codec'来自一组有效的编码,所以这个解决方案是Python2特有的。
我认为您最好的选择是扩展RotatingFileHandler这样的内容(未测试):
import os from logging.handlers import RotatingFileHandler COMPRESSION_SUPPORTED = {} try: import gzip COMPRESSION_SUPPORTED['gz'] = gzip except ImportError: pass try: import zipfile COMPRESSION_SUPPORTED['zip'] = zipfile except ImportError: pass class NewRotatingFileHandler(RotatingFileHandler): def __init__(self, *args, **kws): compress_mode = kws.pop('compress_mode') try: self.compress_cls = COMPRESSION_SUPPORTED[compress_mode] except KeyError: raise ValueError('"%s" compression method not supported.' % compress_mode) super(NewRotatingFileHandler, self).__init__(self, *args, **kws) def doRollover(self): super(NewRotatingFileHandler, self).doRollover() # Compress the old log. old_log = self.baseFilename + ".1" with open(old_log) as log: with self.compress_cls.open(old_log + '.gz', 'wb') as comp_log: comp_log.writelines(log) os.remove(old_log)
接受的答案将只存档一个文件-(basefile.log.1)。其他文件不存档。 此代码将存档除基本文件以外的所有日志文件。
通过使用
encoding='bz2-codec'
初始化RotatingFileHandler
,可以自动写入bz2压缩日志文件:PS.Python3 removed 'bz2-codec'来自一组有效的编码,所以这个解决方案是Python2特有的。
我认为您最好的选择是扩展RotatingFileHandler这样的内容(未测试):
相关问题 更多 >
编程相关推荐