Как создать скользящий регистратор в Python - PullRequest
1 голос
/ 18 мая 2019

Я пытаюсь создать скользящий регистратор для приложения, похожего на автоматический скользящий регистратор Linux.Регистратор должен создать каталог с именем logs (если он не существует) и создавать новый файл журнала при каждом запуске приложения.Я хочу, чтобы в программе было 10 файлов журнала с именами от log0000.log до log0010.log.Если в каталоге logs находится более 10 файлов, он удаляет самый старый файл журнала, а затем перемещает / сворачивает / переименовывает все файлы, чтобы освободить место для текущего журнала.

enter image description here

Поскольку существует более 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()

1 Ответ

0 голосов
/ 18 мая 2019

В основном вам следует сделать следующее:

  • Проверить, достигнуто ли максимальное число файлов
  • Удалить последний файл
  • Переименовать файлы - 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...