如何用Python创建滚动记录器

2024-09-30 22:14:32 发布

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

我正在尝试为一个类似于Linux的自动滚动记录器的应用程序创建一个滚动记录器。记录器应该创建一个名为logs(如果它不存在)的目录,并在每次运行应用程序时创建一个新的日志文件。我希望程序有10个名为log0000.loglog0010.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()

Tags: 文件pathselflogsettingsosloggingdef
2条回答

1创建记录器.ini文件

[loggers]
keys = root

[handlers]
keys = rotatingFileHandler,streamHandler,errorHandler

[formatters]
keys = simpleFmt

[logger_root]
level = DEBUG
handlers = rotatingFileHandler,streamHandler,errorHandler

[handler_rotatingFileHandler]
class = handlers.TimedRotatingFileHandler
level = INFO
formatter = simpleFmt
args = (os.path.abspath(os.getenv("LOG_PATH") + "/default.log"),"midnight", 1, 6,'utf-8')


[handler_errorHandler]
class = handlers.TimedRotatingFileHandler
level = ERROR
formatter = simpleFmt
args = (os.path.abspath(os.getenv("LOG_PATH") + "/error.log"), "midnight", 1, 6,'utf-8')

[handler_streamHandler]
level = INFO
class = StreamHandler
formatter = simpleFmt
args = (sys.stdout,)

[formatter_simpleFmt]
format = %(asctime)s %(pathname)s(%(lineno)d): %(levelname)s %(message)s

2使用ini文件初始化_logger.py在

^{pr2}$

3设置日志路径

os.environ["LOG_PATH"] = "d:/tmp/log/viot"

4使用记录器记录

from my_logger import LOGGER 
LOGGER.debug("log msg")

基本上你应该做的是:

  • 检查是否已达到最大文件数
  • 删除最后一个文件
  • 将文件重命名为-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之间。在

相关问题 更多 >