即使为单个实例配置了对象,对象仍会抛出多个实例

问题描述

我正在用Python进行编码,并且遇到一种情况,即使为单个实例配置了对象,我的对象也会抛出多个实例。因此,我有多个运行脚本的模块,还有一个名为mylogger.py的模块,该模块实例化了logger对象,该对象分别在文件和控制台中存储和显示脚本的日志。我从脚本中的多个模块调用模块mylogger.py。但是,我想确保对于来自不同模块的多个调用,我使用相同的初始对象,以免在日志文件中多次插入相同的行。但是我不确定即使进行了正确的配置,每次从不同的模块调用setLogger()函数时,是否还会看到创建多个对象。

# mylogger.py

import logging

logger = None


def setLogger(filename="logfile.txt"):
    global logger
    print("*********VALUE OF LOGGER IN FUNCTION******** ",logger)
    if logger is None:
        logger = logging.getLogger(__name__)     # creating logger object only once
    if not getattr(logger,'handler_set',None):
        logger.setLevel(logging.INFO)
        stream_handler = logging.StreamHandler()
        file_handler = logging.FileHandler(filename)
        formatter = logging.Formatter('%(message)s')
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)
        logger.addHandler(stream_handler)
        logger.setLevel(logging.INFO)
        logger.propagate = False
        logger.handler_set = True
    return logger

我正在从多个模块调用文件。我已经包含了调用mylogger.py文件的部分。

#firstModule.py
import mylogger
import os 
import sys

logger = mylogger.setLogger()
logger.info("Logger object in firstModule is ",logger)
# Some code 
# and print statements
# goes here
# Trigger next module by calling it using os.system(...)
os.system('python' + path_of_script/secondModule.py)

现在secondModule.py调用mylogger.py

#secondModule.py
import mylogger
import os 
import sys

logger = mylogger.setLogger()
logger.info("Logger object in secondModule is ",logger)

# Some code
#and print statements
#go here
#And then it calls some other module

因此,对于firstModule.py和secondModule.py以及随后的后续模块,基本上在logger文件中的记录器对象不同,该模块在logfile.txt中打印出同一语句的多行。但是,通过streamHandler()在控制台上打印的行很好,因为它只为单个logger.info()打印出一行。这似乎很奇怪,因为streamHandler()和fileHandler()都是使用相同的功能配置的。

解决方法

您有两个过程(通过os.system()),所以当然您有不同的对象。为了“触发下一个模块”,请改用import