logging模块如何实现日志文件基于时间进行分割?

TimeRotatingFileHandler类

  • 简介

    • 基于时间来分割日志,主要用到logging.handlers模块中的TimeRotatingFileHandler类
  • 初始化参数

    • filename: 不带suffix的文件名
    • when: 分割的条件
      • 'S':秒
      • 'M':分
      • 'H':小时
      • 'D':天
      • 'midnight':凌晨00:00
      • 'W{0-6}':比如'W0'表示星期一,'W1'表示星期二
    • interval:间隔,表示间隔n个单位when后会新建日志文件
    • backupCount:保留日志文件的个数,默认0,不会自动删除日志,如果设为3,则保留最近的3个带时间尾缀的日志文件以及1个不带尾缀的日志文件,总共4个文件(最好使用默认的日志suffix或者按照相应的规则去设置,否则无法按照要求保留日志文件个数)
  • 示例

    import time
    import logging
    
    from logging.handlers import TimedRotatingFileHandler
    
    
    class Log:
        def __init__(self, name=None, log_level=logging.DEBUG):
            # 获取logger对象
            self.logger = logging.getLogger(name)
            # 指定最低日志级别:(critical > error > warning > info > debug)
            self.logger.setLevel(log_level)
            # 日志格化字符串
            file_fmt = '%(asctime)s-%(threadName)s-%(filename)s-[line:%(lineno)d]-%(levelname)s: %(message)s'
            file_formatter = logging.Formatter(fmt=file_fmt)
    
            # 输出到文件
            file_name = f'./logs/test.log'
            # 每隔1分钟新建1个日志文件,并保留最新的2个
            file_handler = TimedRotatingFileHandler(filename=file_name, when='M', interval=1, backupCount=2,
                                                    encoding='utf-8')
            # 每隔5秒新建1个日志文件,并保留最新的3个
            # file_handler = TimedRotatingFileHandler(filename=file_name, when='S', interval=5, backupCount=3, encoding='utf-8')
    
            # 设置日志格式
            file_handler.setFormatter(file_formatter)
            # logger添加处理器
            # 避免重复打印日志
            if not self.logger.handlers:
                self.logger.addHandler(file_handler)
    
        def debug(self, message):
            self.logger.debug(message)
    
        def info(self, message):
            self.logger.info(message)
    
        def warning(self, message):
            self.logger.warning(message)
    
        def error(self, message):
            self.logger.error(message)
    
        def critical(self, message):
            self.logger.critical(message)
    
    
    if __name__ == '__main__':
        log = Log()
        for i in range(200):
            log.info(f'test_{i}')
            time.sleep(1)
  • 输出结果

    • 由于文件名设为test.log,backupCount=2,所以会保留2个最新分割出来的带有时间尾缀的日志文件,而最新未分割出来的日志内容均保留在test.log文件中,总共3个文件
posted @ 2023-02-02 04:16  eliwang  阅读(244)  评论(0编辑  收藏  举报