【发布时间】:2020-10-18 23:59:21
【问题描述】:
我在 Python 2.7 上做这个项目,我正在尝试转换这个返回日志对象的函数。我试图确保我可以通过不同的 python 模块使用相同的对象实例,方法是导入它而不实际创建新实例?例如,如果我实际上导入了最初创建实例的模块,则每次导入它时都会创建一个新实例。但我想在所有不同的地方使用相同的原始实例 模块,这是我第一次运行该模块时创建的,因为由于多个实例,在我的日志文件中打印出多行。这就是为什么需要 Python 2.7 中的单例类的原因,但我不确定如何将此函数转换为单例类,以便它返回一个实例,并且我可以通过导入在所有不同的模块中使用它而不触发新实例。 setLogger 函数创建一个记录器实例,该实例将日志输入到 file_name 日志文件中。
def setLogger(file_name):
logger = logging.getLogger(__name__)
if not getattr(logger, 'handler_set', None):
logger.setLevel(logging.INFO)
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler(file_name)
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
【问题讨论】:
-
此函数的行为已经符合您的预期。它将始终返回相同的记录器对象,因为
logging.getLogger负责处理。 -
@zvone 不,它没有。每次我调用这个函数时,它都会创建一个不同的实例。我正在从不同的模块调用包含此功能的模块。所以每次调用它都会创建不同的对象实例。但我想要始终使用相同的实例
-
__name__是当前模块的名称,这就是为每个模块创建不同日志的原因。您可以使用任何字符串作为名称。为每个实例调用尝试logger = logging.getLogger('MyLog'),以便每次都使用相同的日志。 -
@Mike67 我刚刚尝试将 name 替换为“MyLog”,但没有成功。我明确打印出创建的对象,它们对于不同的模块都是不同的
标签: python python-2.7 logging singleton single-instance