首页 > 解决方案 > 如何在 Python 中创建滚动记录器

问题描述

我正在尝试为类似于 Linux 的自动滚动记录器的应用程序创建滚动记录器。记录器应该创建一个名为logs(如果它不存在)的目录,并在每次运行应用程序时创建一个新的日志文件。我希望程序有 10 个日志文件的上限,log0000.log名为log0010.log. 如果目录中有超过 10 个文件logs,它会删除最旧的日志文件,然后移动/滚动/重命名所有文件以为当前日志腾出空间。

在此处输入图像描述

由于有超过 10 个文件,它应该删除log0000.log并重命名每个日志文件,以便为新文件腾出空间。每次运行程序时,我都实现了创建日志逻辑,但是当目录中有超过 10 个文件时,我无法转移日志。

import os
import time
import logging

class RollingLogger(object):
    def __init__(self):
        self.NUMBER_OF_LOGS = 10
        self.initialize_logger_settings()

    def initialize_logger_settings(self):
        """Set logger configuration settings"""

        self.initialize_log_directory()
        logging.basicConfig(filename= self.path + self.filename, 
                            filemode='w', 
                            level=logging.INFO, 
                            format='%(asctime)s.%(msecs)03d,%(message)s',
                            datefmt='%d-%b-%y,%H:%M:%S')
        logging.info('Successfully loaded logger configuration settings')

    def initialize_log_directory(self):
        """Create directory and log file"""

        self.path = 'logs/'

        if not os.path.exists(self.path):
            os.makedirs(self.path)
            self.filename = 'log0000.log'
        else:
            self.filename = self.get_next_log_file_name()

    def get_next_log_file_name(self):
        """Scans log directory for latest log file and returns a new filename"""

        def extract_digits(filename):
            s = ''
            for char in filename:
                if char.isdigit():
                    s += char
            return int(s)

        l = [extract_digits(filename) for filename in os.listdir(self.path)]
        # Directory is empty
        if not l:
            return 'log0000.log'
        # Directory has files so find latest
        else:
            latest_file_number = max(l)
            return 'log' + '{0:04d}'.format(latest_file_number + 1) + '.log'

logger = RollingLogger()

标签: pythonlogging

解决方案


基本上你应该做的是:

  • 检查您是否已达到最大文件数
  • 删除最后一个文件
  • 重命名文件 - 8-->9、7-->8 等等
  • 创建文件编号 0

您的else子句应如下所示:

else:
    latest_file_number = max(l)
    if latest_file_number >= self.NUMBER_OF_LOGS - 1:
        largest_file_name = self.path + 'log' + '{0:04d}'.format(latest_file_number) + '.log'
        os.remove(largest_file_name)
        for i in range(self.NUMBER_OF_LOGS - 1, 0, -1):
            name1 = self.path + 'log' + '{0:04d}'.format(i - 1) + '.log'
            name2 = self.path + 'log' + '{0:04d}'.format(i) + '.log'
            os.rename(name1, name2)
        return 'log0000.log'
    return 'log' + '{0:04d}'.format(latest_file_number + 1) + '.log'

另请注意,如果您想要 10 个文件,它们的编号将在 0-9 范围内。


推荐阅读