【问题标题】:hourly log rotation in python / djangopython / django中的每小时日志轮换
【发布时间】:2013-03-21 11:10:00
【问题描述】:

我在python logging 上查看了 Python 文档,并通过一些实验,我不太明白,

当第一次计算下一次轮换时间时(当处理程序创建时),现有日志文件的最后修改时间,或者当前时间,用于计算下一次轮换发生的时间。

我发现每小时轮换的轮换时间受我开始记录的时间影响,比如 12:23:33 开始,下一次轮换是 13:23:33,这最终会混淆日志文件名。

代码是这样的,

TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)

有什么方法可以强制每小时日志轮换从 00 分钟开始,例如 13:00:00,而不是日志记录开始的时间,并且每个日志将只包含其日志文件名所指示的小时内的日志?

【问题讨论】:

    标签: python django logging


    【解决方案1】:

    查看TimedRotatingFileHandler 的代码,您不能强制它以特定的分钟值旋转:根据文档,如果日志文件已经存在,下一次翻转将发生在logfile last modification time + interval,或者@987654323 @如果没有。

    但由于您似乎知道文件名,您可以通过首先将日志文件的最后修改时间设置为当前时间来欺骗TimedRotatingFileHandler

    from    datetime import datetime
    import  os, time
    
    thishour = datetime.now().replace(minute = 0, second = 0, microsecond = 0)
    timestamp = time.mktime(thishour.timetuple())
    
    # this opens/creates the logfile...
    with file(filename, 'a'):
        # ...and sets atime/mtime
        os.utime(filename, (timestamp, timestamp))
    
    TimedRotatingFileHandler(filename, ...)
    

    (未经测试)

    【讨论】:

      【解决方案2】:

      我还附上了另一个答案。 Python 日志支持 WatchedFileHandler,如果发现文件信息更新,它将关闭并重新打开具有相同文件名的日志文件。它与 linux logrotate 守护程序一样的系统级日志轮换很好地工作。

      【讨论】:

        【解决方案3】:
            logger = logging.getLogger()
        
            log_format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s'
            logging.basicConfig(format=log_format, level=level)
        
            # Create 'log' directory if not present
            log_path = os.path.dirname(logfile)
            if not os.path.exists(log_path):
                os.makedirs(log_path)
        
            handler = TimedRotatingFileHandler(
                logfile,
                when="H",
                interval=1,
                encoding="utf-8")
        
            handler.setFormatter(logging.Formatter(log_format))
            handler.extMatch = re.compile(r"^\d{8}$")
            handler.suffix = "%Y%m%d"
            handler.setLevel(level)
        
            logger.addHandler(handler)
        

        【讨论】:

          猜你喜欢
          • 2017-11-15
          • 2014-01-06
          • 2017-12-19
          • 1970-01-01
          • 2022-01-25
          • 1970-01-01
          • 2016-10-18
          • 2016-09-21
          • 2011-06-06
          相关资源
          最近更新 更多