我正在使用TimedRotatingFileHandler创建日志。 我希望我的日志文件被创建每分钟,最多保留2个日志文件和删除旧的。下面是示例代码:
import logging
import logging.handlers
import datetime
logger = logging.getLogger('MyLogger')
logger.setLevel(logging.DEBUG)
handler = logging.handlers.TimedRotatingFileHandler(
"logs/{:%H-%M}.log".format(datetime.datetime.now()),
when="M",
backupCount=2)
logger.addHandler(handler)
logger.debug("PLEASE DELETE PREVIOUS FILES")
如果我多次运行此代码(以分钟为间隔),我会在日志目录中获取多个文件,如下所示:
^{pr2}$这对我来说似乎很奇怪,因为我设置了backupCount=2
,它表示最多应该保存2个文件,应该删除旧的文件。但是,当我在日志文件夹中使用2个或更多文件启动应用程序时,旧文件不会被删除。在
为什么TimeDrotingFileHandler不删除旧文件? 有没有办法设置TimeDrotingFileHandler来删除旧文件?在
您不能按照设计将} method 中生成)。请注意,只有在旋转发生时才会删除备份,因此在处理程序已使用至少一个完整间隔之后。在
TimedRotatingFileHandler
用于您的用例。处理程序希望“当前”日志文件名保持稳定,并将旋转定义为通过重命名将现有日志文件移动到备份。这些是保留或删除的备份。旋转备份是从基本文件名加上带有旋转时间戳的后缀创建的。因此,该实现区分了日志文件(存储在baseFilename
)和旋转文件(在^{相反,您希望基文件名本身携带时间信息,因此需要改变日志文件名本身。在这种情况下没有“备份”,您只需在轮换时打开一个新文件。此外,您似乎正在运行短生命的Python代码,因此您希望立即删除较旧的文件,而不仅仅是在显式旋转时,这可能永远无法达到。在
这就是为什么
TimedRotatingFileHandler
不会删除任何文件,因为*它永远无法创建备份文件。没有备份意味着没有要删除的备份。为了循环文件,处理程序的当前实现需要负责文件名的生成,而不能期望知道它本身不会生成的文件名。当您将其配置为"M"
每分钟的旋转频率时,它被配置为以{baseFileame}.{now:%Y-%m-%d_%H_%M}
模式将文件旋转到备份文件,因此只会删除与该模式匹配的旋转备份文件。请参见documentation:相反,您需要的是一个基本文件名,它本身带有时间戳,当打开一个具有不同名称的新日志文件时,旧的日志文件(不是备份文件)将被删除。为您创建一个自定义处理程序。在
幸运的是,类层次结构是专门为方便定制而设计的。您可以在此处子类^{} ,并提供您自己的删除逻辑:
在日志文件名中与^{} placeholders 一起使用,这些将为您填写:
^{pr2}$请注意,当您创建实例时,这会清理旧文件。在
正如其他人已经指出的那样,
backupCount
只有当你总是用相同的文件名登录到文件,然后时不时地旋转时,backupCount
才有效。然后您将显示@Bsquare之类的日志文件。 但是,在我的例子中,我需要每天轮换,并让我的日志文件具有以下名称:2019-07-06.log
,2019-07-07.log
,2019-07-07.log
。。。 我发现使用TimedRotatingFileHandler的当前实现是不可能的所以我在FileHandler上创建了适合我需要的删除功能 这是一个logger类的简单示例,该类使用
FileHandler
,它将确保每次创建此类的实例时都删除旧日志文件:然后你可以这样使用它:
^{pr2}$正如您在TimedRotatingFileHandler文档中看到的那样,您的日志文件名应该是相同的,以便正确地获取旋转系统。在
在您的例子中,因为您自己附加了日期时间信息,所以每次日志文件名都是不同的,因此您可以观察结果。在
因此,在源代码中,只需调整日志文件名:
如果您想挑战它,可以将
when
更改为“S”(秒),并检查旋转是否正常。在例如,它将自动生成这样的文件:
^{pr2}$如果你需要更多的信息,不要犹豫。在
相关问题 更多 >
编程相关推荐