问题描述
我正在用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
。