自动删除旧的Python日志文件

2024-05-13 19:46:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个每天运行的Python程序。我使用带有FileHandler的logging模块将日志写入文件。我希望每次运行的日志都在自己的文件中,并带有时间戳。但是,我想删除旧文件(比如说3个月)以避免填满磁盘。在

我已经看过RotatingFileHandler和timedrotingfilehandler,但我不希望一次运行的日志被拆分到多个文件中,即使一次运行需要几天时间。有内置的方法吗?在


Tags: 模块文件方法程序logging时间内置磁盘
2条回答

得到日期/时间。关于如何获取时间戳,请参阅answer。如果文件比当前日期早3个月。然后用

import os
os.remove("filename.extension")

将此文件保存到py2exe,然后使用任何任务计划程序在启动时运行此作业。在

窗口:打开运行命令并输入shell:启动,然后将exe放入此处。在

在OSX上:过去的老方法是创建cron作业,从我的经验来看,这种方法在很多情况下都不起作用,但仍在尝试。苹果新推荐的方式是CreatingLaunchdJobs。你也可以参考这个topic来获得更详细的解释。在

正如this question中的@MartijnPieters所建议的那样,您可以轻松地扩展FileHandler类来处理自己的删除逻辑。 例如,我的类只保存最后一个“备份计数”文件。在

import os
import re
import datetime
import logging 
from itertools import islice


class TimedPatternFileHandler(logging.FileHandler):
    """File handler that uses the current time fo the log filename,
    by formating the current datetime, according to filename_pattern, using
    the strftime function.

    If backup_count is non-zero, then older filenames that match the base
    filename are deleted to only leave the backup_count most recent copies,
    whenever opening a new log file with a different name.

    """

    def __init__(self, filename_pattern, mode, backup_count):
        self.filename_pattern = os.path.abspath(filename_pattern)
        self.backup_count = backup_count
        self.filename = datetime.datetime.now().strftime(self.filename_pattern)


        delete = islice(self._matching_files(), self.backup_count, None)
        for entry in delete:
            # print(entry.path)
            os.remove(entry.path)
        super().__init__(filename=self.filename, mode=mode)

    @property
    def filename(self):
        """Generate the 'current' filename to open"""
        # use the start of *this* interval, not the next
        return datetime.datetime.now().strftime(self.filename_pattern)

    @filename.setter
    def filename(self, _):
        pass

    def _matching_files(self):
        """Generate DirEntry entries that match the filename pattern.

        The files are ordered by their last modification time, most recent
        files first.

        """
        matches = []
        basename = os.path.basename(self.filename_pattern)
        pattern = re.compile(re.sub('%[a-zA-z]', '.*', basename))

        for entry in os.scandir(os.path.dirname(self.filename_pattern)):
            if not entry.is_file():
                continue
            entry_basename = os.path.basename(entry.path)
            if re.match(pattern, entry_basename):
                matches.append(entry)
        matches.sort(key=lambda e: e.stat().st_mtime, reverse=True)
        return iter(matches)


def create_timed_rotating_log(path):
    """"""
    logger = logging.getLogger("Rotating Log")
    logger.setLevel(logging.INFO)

    handler = TimedPatternFileHandler('{}_%H-%M-%S.log'.format(path), mode='a', backup_count=5)

    logger.addHandler(handler)
    logger.info("This is a test!")

相关问题 更多 >