Python TimedRotatingFileHandler 修改suffix后无法自动删除文件

Python TimedRotatingFileHandler 修改suffix后无法自动删除文件

TimedRotatingFileHandler 用法自行百度
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight

1s一个日志,超过3个删除

	log = logging.getLogger()
	log.setLevel(logging.ERROR)  # 日志等级为ERROR
	
	fh = logging.handlers.TimedRotatingFileHandler("log", when='S', interval=1, backupCount=3)
	fh.suffix = "%Y-%m-%d_%H-%M-%S.log"
	formatter = logging.Formatter('[%(asctime)s] - %(filename)s [Line:%(lineno)d] - [%(levelname)s]-[thread:%(thread)s]-[process:%(process)s] - %(message)s') 
	fh.setFormatter(formatter)
	log.addHandler(fh)
	i = 0
	while i < 100000000:
	    sleep(0.1)
	    log.error("记录" + str(i))
	    i = i + 1

结果是并不会删除

在这里插入图片描述

查看TimedRotatingFileHandler的源码

def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False):
        BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay)
        self.when = when.upper()
        self.backupCount = backupCount
        self.utc = utc      
        if self.when == 'S':
            self.interval = 1 # one second
            self.suffix = "%Y-%m-%d_%H-%M-%S"
            self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$"
        elif self.when == 'M':
            self.interval = 60 # one minute
            self.suffix = "%Y-%m-%d_%H-%M"
            self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$"
        elif self.when == 'H':
            self.interval = 60 * 60 # one hour
            self.suffix = "%Y-%m-%d_%H"
            self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}$"
        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}$"
        elif self.when.startswith('W'):
            self.interval = 60 * 60 * 24 * 7 # one week
            if len(self.when) != 2:
                raise ValueError("You must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s" % self.when)
            if self.when[1] < '0' or self.when[1] > '6':
                raise ValueError("Invalid day specified for weekly rollover: %s" % self.when)
            self.dayOfWeek = int(self.when[1])
            self.suffix = "%Y-%m-%d"
            self.extMatch = r"^\d{4}-\d{2}-\d{2}$"
        else:
            raise ValueError("Invalid rollover interval specified: %s" % self.when)

        self.extMatch = re.compile(self.extMatch)
        self.interval = self.interval * interval # multiply by units requested
        if os.path.exists(filename):
            t = os.stat(filename)[ST_MTIME]
        else:
            t = int(time.time())
        self.rolloverAt = self.computeRollover(t)

关键是下面的几行

self.suffix = "%Y-%m-%d_%H-%M-%S"
self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$"
······
······
self.extMatch = re.compile(self.extMatch)

默认设置when类型后,suffix是固定的,匹配的正则也是源码里写好的,所以当修改suffix后,必须连带正则一并修改

最终代码如下

log = logging.getLogger()
log.setLevel(logging.ERROR)  # 日志等级为ERROR

fh = logging.handlers.TimedRotatingFileHandler("log", when='S', interval=1, backupCount=3)
fh.suffix = "%Y-%m-%d_%H-%M-%S.log"
fh.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}.log$"
fh.extMatch = re.compile(fh.extMatch)
formatter = logging.Formatter('[%(asctime)s] - %(filename)s [Line:%(lineno)d] - [%(levelname)s]-[thread:%(thread)s]-[process:%(process)s] - %(message)s') 
fh.setFormatter(formatter)
log.addHandler(fh)
i = 0
while i < 100000000:
    sleep(0.1)
    log.error("记录" + str(i))
    i = i + 1

演示Demo
https://download.csdn.net/download/qgf1099062139/12252962

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中的TimedRotatingFileHandler是一个日志处理器,用于按时间对日志文件进行循环切割。 循环切割意味着在固定的时间间隔内,会为每个时间段生成一个新的日志文件TimedRotatingFileHandler的主要参数是filename、when和interval。 - filename:要写入的日志文件文件名。 - when:确定日志文件轮换的时间单位,可以是"midnight"(午夜)、"S"(秒)或"H"(小时)等。 - interval:时间间隔,表示多少个when单位后会进行日志文件切割。 示例代码如下: ```python import logging from logging.handlers import TimedRotatingFileHandler logger = logging.getLogger("example_logger") logger.setLevel(logging.DEBUG) # 创建TimedRotatingFileHandler对象 handler = TimedRotatingFileHandler("example.log", when="midnight", interval=1) handler.suffix = "%Y-%m-%d" # 日志文件名后缀格式化 # 设置日志格式 formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) # 将handler添加到logger logger.addHandler(handler) # 输出日志 logger.debug("Debug message") logger.info("Info message") logger.warning("Warning message") ``` 上述代码创建了一个logger对象,设置了日志级别为DEBUG。然后,创建了一个TimedRotatingFileHandler对象,设置切割文件名后缀的格式为年-月-日。接着,设置了日志的格式,并将handler对象添加到logger中。最后,通过logger输出了不同级别的日志信息。 当运行以上代码时,每天午夜(当when="midnight")到来时,会自动将日志写入一个新的文件文件名的格式为example_2022-05-23.log、example_2022-05-24.log等。这样就实现了按时间循环切割日志文件的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值