Python中使用单例方法在日志记录包中创建一个实例

Python中使用单例方法在日志记录包中创建一个实例,python,class,logging,singleton,Python,Class,Logging,Singleton,作为新手在Python中编写此代码,并尝试理解如何在单独的模块中创建日志类的单个实例。我正在尝试从python脚本访问日志模块。因此,我在这个自动化脚本中有不同的文件,我试图在一个文件中记录日志,同时在控制台中显示日志,因此我将使用两个处理程序,即FileHandler()和StreamHandler()。logger的初始化在另一个名为debugLogs.py的文件中,我正在从运行该脚本的多个Python模块访问该文件。但是如果单独的模块调用debugLogs.py,它会创建记录器的多个实例,

作为新手在Python中编写此代码,并尝试理解如何在单独的模块中创建日志类的单个实例。我正在尝试从python脚本访问日志模块。因此,我在这个自动化脚本中有不同的文件,我试图在一个文件中记录日志,同时在控制台中显示日志,因此我将使用两个处理程序,即FileHandler()和StreamHandler()。logger的初始化在另一个名为debugLogs.py的文件中,我正在从运行该脚本的多个Python模块访问该文件。但是如果单独的模块调用debugLogs.py,它会创建记录器的多个实例,这意味着它会被打印多次,这不是我想要的。这就是为什么我需要使用singleton方法来创建一个实例。你建议我怎么做?我已经在代码中包含了我的debugLogs.py版本,并且

#debugLogs.py

import logging
import logging.handlers

#open readme file and read name of latest log file created
def get_name():
    with open("latestLogNames.txt") as f:
        for line in f:
            pass
        latestLog = line
    logfile_name = latestLog[:-1]
    return logfile_name


class Logger(object):
    _instance = None
    def __new__(self, logfile_name):
        if not self._instance:
            self._instance = super(Logger, self).__new__(self)
            logger = logging.getLogger(__name__)
            logger.setLevel(logging.INFO)
            formatter = logging.Formatter('%(message)s')
            file_handler = logging.FileHandler(logfile_name)
            file_handler.setFormatter(formatter)
            stream_handler = logging.StreamHandler()
            logger.addHandler(file_handler)
            logger.addHandler(stream_handler)
        return self._instance

因此get_name()获取自述文件latestLogNames.txt中已指示的最新日志名,并将日志输入已存在的最新日志文件中。 我知道我的单例类代码不正确,我对如何初始化整个类结构感到困惑。但不知何故,我必须将logfile_name值传递给该类。因此,我计划从另一个模块调用此记录器,如下所示:

#differentModule.py

import debugLogs
logger = debugLogs.Logger(debugLogs.get_name())

然后我将使用logger.info(“…”)打印日志并将其存储在文件中。请告诉我如何重新构造debugLogs.py,以及如何从脚本的不同模块调用它。

如果您是python新手,我强烈建议您学习python 3。Python2已经到了生命的尽头。@HiroProgator我会的,但我正在编写一个遗留代码,因此为此我必须使用Python2.7。有什么解决办法吗???你想干什么就干什么。配置它返回一次的记录器(通常在程序启动时),并使用
getLogger(“my_logger”)
@hiroProtation在代码中的任何位置获取记录器。您的意思是通过执行logger=logging.getLogger(name)初始化记录器,然后通过执行logger.setLevel(logging.INFO)来设置级别和格式化程序等每个模块中的格式化程序('%(消息)s')?这样,我甚至不需要debugLogs.py。但是我有很多模块,所以为了停止重复代码,我创建了debugLogs.py,以便所有其他模块都可以调用它并配置记录器。但如果它从不同的模块调用,创建不同的实例,这不是我想要的,因为它会打印出多个实例lines@hiroprotagonist我也面临着类似的问题,我似乎无法解决创建多个实例的问题。singleton方法应该正确工作,但是如何以正确的方式实现它呢?