【发布时间】: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