python - 如何在 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()
解决方案
基本上你应该做的是:
- 检查您是否已达到最大文件数
- 删除最后一个文件
- 重命名文件 - 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 范围内。
推荐阅读
- asp.net-mvc - 将 Blazor 中的井字游戏转换为 .Net Core MVC
- linux - 是否可以转储 Kbuild?
- javascript - 如何在javascript中更改backgorundColor元素onclick?
- javascript - 在脚本中更改图像的大小?
- c# - 从 web api 2 迁移到 .net 5 web api 的问题
- python - 如何使用 HMM 模型进行音频分割
- wordpress - 弄清楚如何在自定义 pdf 主题(DOMpdf 和 Fooevents)时修复空白页
- metpy - 如何使用声明性语法增加metpy中的文本大小?
- python - 在 PyCharm 中编写 HTML
- tensorflow - Keras 均方差损失