TimedRotatingFileHandler 不会自动清除旧日志的问题
话不多说,直接贴代码:
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
是可以匹配到后缀名的。
评论区