Я пытаюсь создать скользящий регистратор для приложения, похожего на автоматический скользящий регистратор Linux.Регистратор должен создать каталог с именем logs
(если он не существует) и создавать новый файл журнала при каждом запуске приложения.Я хочу, чтобы в программе было 10 файлов журнала с именами от log0000.log
до log0010.log
.Если в каталоге logs
находится более 10 файлов, он удаляет самый старый файл журнала, а затем перемещает / сворачивает / переименовывает все файлы, чтобы освободить место для текущего журнала.
![enter image description here](https://i.stack.imgur.com/2DxLH.png)
Поскольку существует более 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()