Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动删除旧的Python日志文件_Python_Logging - Fatal编程技术网

自动删除旧的Python日志文件

自动删除旧的Python日志文件,python,logging,Python,Logging,我有一个每天运行的Python程序。我正在使用FileHandler的日志记录模块将日志写入文件。我希望每次运行的日志都在自己的文件中,并带有时间戳。但是,我想删除旧文件(比如>3个月),以避免磁盘被填满 我已经研究了RotatingFileHandler和TimedRotatingFileHandler,但我不希望一次运行的日志被分割到多个文件中,即使一次运行需要几天的时间。有内置的方法吗?获取日期/时间。有关如何获取时间戳,请参见此。如果文件比当前日期早3个月。然后用 import os o

我有一个每天运行的Python程序。我正在使用FileHandler的
日志记录
模块将日志写入文件。我希望每次运行的日志都在自己的文件中,并带有时间戳。但是,我想删除旧文件(比如>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")