Python, 技术

TimedRotatingFileHandler 不会自动清除旧日志的问题

2023年04月23日

话不多说,直接贴代码:

file_handler = TimedRotatingFileHandler(
    "logs/log",
    when="midnight",
    backupCount=365,
    encoding="utf-8",
)
file_handler.suffix = "%Y%m%d.log"
file_handler.setFormatter(log_formatter)

这是我几年前写的一段写日志文件的代码,前几天发现并没有按照预期只保留 365 个日志文件。研究了一下,发现了问题所在。TimedRotatingFileHandler 中对于 midnight 的操作是这样的:

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}(\.\w+)?$"
# ... other code
self.extMatch = re.compile(self.extMatch, re.ASCII)

可以看到,其默认的 suffix 是 %Y-%m-%d,我之所以要加 .log 后缀,是因为如果不带后缀的话,群晖的文本编辑器默认不能直接打开这个文件,不太方便看日志。

它默认的匹配正则是 r"^\d{4}-\d{2}-\d{2}(\.\w+)?$",当我把 suffix 改成 %Y%m%d.log 之后,它就无法匹配到旧日志的数量了,所以保留日志个数的功能会失效。有两种办法解决:

一是加一行:

self.extMatch = re.compile(r"^\d{4}\d{2}\d{2}\.log$")

另一种更简单:

suffix 改成 %Y-%m-%d.log 即可,因为默认的 extMatch 是可以匹配到后缀名的。

您已成功订阅 HADB.ME
真棒!下一步,完成结账以便解锁 HADB.ME
欢迎回来!您已登录成功。
登录失败,请重试。
操作成功!您的账户已全面激活,现在您有所有内容的权限了。
错误!Stripe 结账失败。
成功!您的账单信息已更新。
错误!账单信息更新失败。