【问题标题】:Object throwing multiple instances even though it's configured for a single instance对象抛出多个实例,即使它是为单个实例配置的
【发布时间】:2020-10-20 18:41:47
【问题描述】:

我正在使用 Python 进行编码,我面临这样一种情况,即我的对象抛出多个实例,即使它已配置为单个实例。因此,我有多个运行脚本的模块,并且有一个名为 mylogger.py 的模块实例化了记录器对象,该对象分别在文件和控制台中存储和显示脚本的日志。我从脚本中的多个模块调用模块 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 以及在 logfile.txt 中打印出多行相同语句的下一个后续模块,基本上 logger 对象是不同的。但是,通过 streamHandler() 在控制台上打印的行很好,因为它只为单个 logger.info() 打印出单行。这看起来很奇怪,因为 streamHandler() 和 fileHandler() 都是使用相同的函数配置的。

【问题讨论】:

  • 我在下面回答了你的问题,但这实际上可能对你没有帮助,因为我认为你问错了问题。特别是,这可能是所谓的“XY 问题”。作为新用户,也请带上tour阅读How to Ask

标签: python python-2.7 logging multiple-instances single-instance


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    相关资源
    最近更新 更多