自动删除旧的Python日志文件
我有一个每天运行的Python程序。我正在使用FileHandler的自动删除旧的Python日志文件,python,logging,Python,Logging,我有一个每天运行的Python程序。我正在使用FileHandler的日志记录模块将日志写入文件。我希望每次运行的日志都在自己的文件中,并带有时间戳。但是,我想删除旧文件(比如>3个月),以避免磁盘被填满 我已经研究了RotatingFileHandler和TimedRotatingFileHandler,但我不希望一次运行的日志被分割到多个文件中,即使一次运行需要几天的时间。有内置的方法吗?获取日期/时间。有关如何获取时间戳,请参见此。如果文件比当前日期早3个月。然后用 import os o
日志记录
模块将日志写入文件。我希望每次运行的日志都在自己的文件中,并带有时间戳。但是,我想删除旧文件(比如>3个月),以避免磁盘被填满
我已经研究了RotatingFileHandler和TimedRotatingFileHandler,但我不希望一次运行的日志被分割到多个文件中,即使一次运行需要几天的时间。有内置的方法吗?获取日期/时间。有关如何获取时间戳,请参见此。如果文件比当前日期早3个月。然后用
import os
os.remove("filename.extension")
将此文件保存到,然后在启动时使用任何任务计划程序运行此作业
Windows:打开运行命令并输入shell:startup,然后将您的exe放入此处
在OSX上:以前的方法是创建cron作业,根据我的经验,这在很多情况下不再有效,但仍然可以尝试。苹果公司推荐的新方法是。您还可以参考这篇文章以获得更详细的解释。正如中@MartijnPieters所建议的,您可以轻松地扩展FileHandler类以处理您自己的删除逻辑。 例如,我的类将只保存最后的“备份计数”文件
日志模块具有内置的TimedRotatingFileHandler:
# import module
from logging.handlers import TimedRotatingFileHandler
from logging import Formatter
# get named logger
logger = logging.getLogger(__name__)
# create handler
handler = TimedRotatingFileHandler(filename='runtime.log', when='D', interval=1, backupCount=90, encoding='utf-8', delay=False)
# create formatter and add to handler
formatter = Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# add the handler to named logger
logger.addHandler(handler)
# set the logging level
logger.setLevel(logging.INFO)
# --------------------------------------
# log something
logger.info("test")
旧日志会自动附加一个时间戳
每天都会创建一个新的备份
如果存在超过91个(当前+备份)文件,最旧的文件将被删除。您可以在Python之外执行此操作,只需使用Cron作业每隔一段时间运行一次
find
(参见示例)。但我对“我希望每天的日志都在自己的文件中”和“我不希望一次运行的日志被分割到多个文件中,即使一次运行需要几天”感到困惑。谢谢。不过,我正在日志模块中寻找解决方案。为了清晰起见,我进行了编辑。@jonrsharpe cron很久以前就被弃用了,在osx中的许多任务都不能很好地工作。谢谢你的回答,但问题是日志模块本身在哪里支持这种功能。创建一个单独的程序来处理它是非常简单的。
import logging
import time
from logging.handlers import RotatingFileHandler
logFile = 'test-' + time.strftime("%Y%m%d-%H%M%S")+ '.log'
logger = logging.getLogger('my_logger')
handler = RotatingFileHandler(logFile, mode='a', maxBytes=50*1024*1024,
backupCount=5, encoding=None, delay=False)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
for _ in range(10000):
logger.debug("Hello, world!")
# import module
from logging.handlers import TimedRotatingFileHandler
from logging import Formatter
# get named logger
logger = logging.getLogger(__name__)
# create handler
handler = TimedRotatingFileHandler(filename='runtime.log', when='D', interval=1, backupCount=90, encoding='utf-8', delay=False)
# create formatter and add to handler
formatter = Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# add the handler to named logger
logger.addHandler(handler)
# set the logging level
logger.setLevel(logging.INFO)
# --------------------------------------
# log something
logger.info("test")