Python扩展TimedRotatingFileHandler

简介: 【10月更文挑战第7天】 python log执行扩展压缩功能
扩展TimedRotatingFileHandler实现压缩
  • 函数列表

    1. getFilesToDelete

      调用getFilesToDelete,获取要删除log文件列表

    2. getFilesToDelete

      根据self.baseFilename和self.suffix,获取已保留的log文件

    3. doRollover

      当出现log转存时调用,解决转存时压缩问题

    4. doGzip

      对文件进行压缩

  • 实现代码

  1. 代码示例

    import logging                                                                      
    from logging.handlers import TimedRotatingFileHandler 
    import gzip
    import time
    
    class GzTimedRotatingFileHandler(TimedRotatingFileHandler):                      
       def __init__(self, filename, when, backupCount, interval, delay=False):      
           super(GzTimedRotatingFileHandler, self).__init__(filename, when,         
                           interval, backupCount, delay=delay)                      
    
       def doGzip(self, old_log):                                                   
           with open(old_log) as old:                                               
               with gzip.open(old_log + '.gz', 'wb') as comp_log:                   
                   comp_log.writelines(old)                                         
           os.remove(old_log)                 
       def getFilesToDelete(self):                                                  
           """                                                                      
           Determine the files to delete when rolling over.                         
    
           More specific than the earlier method, which just used glob.glob().      
           """                                                                      
           dirName, baseName = os.path.split(self.baseFilename)                     
           fileNames = os.listdir(dirName)                                          
           result = []                                                              
           prefix = baseName + "."                                                  
           plen = len(prefix)                                                       
           for fileName in fileNames:                                               
               if fileName[:plen] == prefix:                                        
                   suffix = fileName[plen:].rstrip(".gz")                           
                   if self.extMatch.match(suffix):                                  
                       result.append(os.path.join(dirName, fileName))               
           result.sort()                                                            
           if len(result) < self.backupCount:                                       
               result = []                                                          
           else:                                                                    
               result = result[:len(result) - self.backupCount]
           return result                                                                                                                               
       def doRollover(self):                                                        
           if self.stream:                                                          
               self.stream.close()                                                  
               self.stream = None                                                   
           # get the time that this sequence started at and make it a TimeTuple     
           currentTime = int(time.time())                                           
           dstNow = time.localtime(currentTime)[-1]                                 
           t = self.rolloverAt - self.interval                                      
           if self.utc:                                                             
               timeTuple = time.gmtime(t)                                           
           else:                                                                    
               timeTuple = time.localtime(t)                                        
               dstThen = timeTuple[-1]                                              
               if dstNow != dstThen:                                                
                   if dstNow:                                                       
                       addend = 3600                                                
                   else:                                                            
                       addend = -3600                                               
                   timeTuple = time.localtime(t + addend)                           
           dfn = self.baseFilename + "." + time.strftime(self.suffix, timeTuple)    
           if os.path.exists(dfn):                                                  
               os.remove(dfn)                                                       
           # Issue 18940: A file may not have been created if delay is True.        
           if os.path.exists(self.baseFilename):                                    
               os.rename(self.baseFilename, dfn)                                    
               self.doGzip(dfn)                                                     
    
           if self.backupCount > 0:                                                 
               for s in self.getFilesToDelete():                                    
                   os.remove(s)
           #if self.stream is None:                                                 
           self.stream = self._open()                                               
           newRolloverAt = self.computeRollover(currentTime)                        
           while newRolloverAt <= currentTime:                                      
               newRolloverAt = newRolloverAt + self.interval                        
           if (self.when == 'MIDNIGHT' or self.when.startswith('W')) and not self.utc:
               dstAtRollover = time.localtime(newRolloverAt)[-1]                    
               if dstNow != dstAtRollover:                                          
                   if not dstNow:  # DST kicks in before next rollover, so we need to deduct an hour
                       addend = -3600                                               
                   else:  # DST bows out before next rollover, so we need to add an hour
                       addend = 3600 
                   newRolloverAt += addend
           self.rolloverAt = newRolloverAt
    
  2. 调用示例

    def test_GzTimedRotatingFileHandler():
       log_filename='/var/log/logTest/log_rotate'
       logger=logging.getLogger('MyLogger')
       logger.setLevel(logging.DEBUG)
       handler = GzTimedRotatingFileHandler(filename=log_filename, maxBytes=10, when="D",  backupCount=5, interval=1)
       logger.addHandler(handler)
       for i in range(100000):
           time.sleep(0.5)
           logger.debug('i=%d ' % i)
    
    if __name__=="__mian__":
       test_GzTimedRotatingFileHandler()
    
相关文章
|
6月前
|
编译器 Linux C语言
python C语言扩展之简单扩展-使用ctypes访问C代码
python C语言扩展之简单扩展-使用ctypes访问C代码
53 0
|
4天前
|
缓存 监控 测试技术
Python中的装饰器:功能扩展与代码复用的利器###
本文深入探讨了Python中装饰器的概念、实现机制及其在实际开发中的应用价值。通过生动的实例和详尽的解释,文章展示了装饰器如何增强函数功能、提升代码可读性和维护性,并鼓励读者在项目中灵活运用这一强大的语言特性。 ###
|
2月前
|
Python
Python--turtle库科赫雪花的扩展
使用Python的turtle库创建科赫雪花,并加入随机阶数、尺寸、位置和颜色的功能,每次运行生成不同图像。
Python--turtle库科赫雪花的扩展
|
1月前
|
机器学习/深度学习 缓存 PyTorch
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
这篇文章是关于如何下载、安装和配置Miniconda,以及如何使用Miniconda创建和管理Python环境的详细指南。
348 0
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
|
2月前
|
存储 缓存 API
比较一下 Python、C、C 扩展、Cython 之间的差异
比较一下 Python、C、C 扩展、Cython 之间的差异
36 0
|
3月前
|
算法 关系型数据库 程序员
程序员必备技能)基于Python的鼠标与键盘控制实战扩展与源码
这篇文章是关于如何使用Python的`pyautogui`库来控制鼠标和键盘进行各种操作,包括移动、点击、滚轮控制以及键盘的按键和快捷键输出,并介绍了如何结合图像处理和计算机视觉技术来扩展其应用。
|
4月前
|
消息中间件 存储 Python
详解Python TimedRotatingFileHandler多进程环境下的问题和解决方法
`TimedRotatingFileHandler`在单进程应用中非常有用,但在多进程环境下直接使用可能会遇到挑战。以上提到的方案可以根据具体情况选取,解决在多进程环境下的日志文件管理问题。综合考虑,采用外部日志管理工具或集中式日志记录方案通常更为稳健和有效,尤其适用于大型或复杂的系统架构。
279 3
|
3月前
|
测试技术 程序员 开发者
探索代码整洁之道:编写可维护和可扩展的Python程序
【8月更文挑战第3天】在编程的海洋中,我们经常追求的是那些能够高效运行、易于理解和维护的代码。本文将深入探讨如何通过遵循一系列的最佳实践来提升Python代码的整洁度,从而增强其可维护性和可扩展性。我们将通过具体示例,展示如何应用这些原则来编写更优雅、更健壮的Python程序。
35 0
|
5月前
|
数据安全/隐私保护 Python
Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。
【6月更文挑战第20天】Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。例如,`@simple_decorator` 包装`my_function`,在调用前后添加额外操作。装饰器还能接受参数,如`@logged(&quot;INFO&quot;, &quot;msg&quot;)`,允许动态定制功能。
44 6
|
4月前
|
存储 数据可视化 数据处理
`geopandas`是一个开源项目,它为Python提供了地理空间数据处理的能力。它基于`pandas`库,并扩展了其对地理空间数据(如点、线、多边形等)的支持。`GeoDataFrame`是`geopandas`中的核心数据结构,它类似于`pandas`的`DataFrame`,但包含了一个额外的地理列(通常是`geometry`列),用于存储地理空间数据。
`geopandas`是一个开源项目,它为Python提供了地理空间数据处理的能力。它基于`pandas`库,并扩展了其对地理空间数据(如点、线、多边形等)的支持。`GeoDataFrame`是`geopandas`中的核心数据结构,它类似于`pandas`的`DataFrame`,但包含了一个额外的地理列(通常是`geometry`列),用于存储地理空间数据。