zoukankan      html  css  js  c++  java
  • python logging 日志轮转文件不删除问题的解决方法

    项目使用了 logging 的 TimedRotatingFileHandler :

    #!/user/bin/env python
    # -*- coding: utf-8 -*-
    
    import logging
    from logging.handlers import TimedRotatingFileHandler
    log = logging.getLogger()
    file_name = "./test.log"
    logformatter = logging.Formatter('%(asctime)s [%(levelname)s]|%(message)s')
    loghandle = TimedRotatingFileHandler(file_name, 'midnight', 1, 2)
    loghandle.setFormatter(logformatter)
    loghandle.suffix = '%Y%m%d'
    log.addHandler(loghandle)
    log.setLevel(logging.DEBUG)
    
    log.debug("init successful")

    参考 python logging 的官方文档:

    https://docs.python.org/2/library/logging.html

    查看其 入门 实例,可以看到使用按时间轮转的相关内容:

    import logging
    
    # create logger
    logger = logging.getLogger('simple_example')
    logger.setLevel(logging.DEBUG)
    
    # create console handler and set level to debug
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    
    # create formatter
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
    # add formatter to ch
    ch.setFormatter(formatter)
    
    # add ch to logger
    logger.addHandler(ch)
    
    # 'application' code
    logger.debug('debug message')

    粗看下,也看不出有什么不对的地方。

    那就看下logging的代码,找到TimedRotatingFileHandler 相关的内容,其中删除过期日志的内容:

    logging/handlers.py

    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:]
        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

    轮转删除的原理,是查找到日志目录下,匹配suffix后缀的文件,加入到删除列表,如果超过了指定的数目就加入到要删除的列表中,再看下匹配的原理:

    elif self.when == 'D' or self.when == 'MIDNIGHT':
       self.interval = 60 * 60 * 24 # one day
       self.suffix = "%Y-%m-%d"
       self.extMatch = r"^d{4}-d{2}-d{2}$"

    exMatch 是一个正则的匹配,格式是 - 分隔的时间,而我们自己设置了新的suffix没有 - 分隔:

    loghandle.suffix = '%Y%m%d'
    这样就找不到要删除的文件,不会删除相关的日志。

  • 相关阅读:
    HDU Railroad (记忆化)
    HDU 1227 Fast Food
    HDU 3008 Warcraft
    asp vbscript 检测客户端浏览器和操作系统(也可以易于升级到ASP.NET)
    Csharp 讀取大文本文件數據到DataTable中,大批量插入到數據庫中
    csharp 在万年历中计算显示农历日子出错
    csharp create ICS file extension
    CSS DIV Shadow
    DataTable search keyword
    User select fontface/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
  • 原文地址:https://www.cnblogs.com/tsw123/p/8978790.html
Copyright © 2011-2022 走看看