def get_logger():
no_format_logger = logging.getLogger("logger")
no_format_logger.setLevel(logging.DEBUG)
not_format_file_handler = logging.FileHandler("./costs.log")
not_format_file_handler.setFormatter(logging.Formatter('%(message)s'))
no_format_logger.addHandler(not_format_file_handler)
return logging.getLogger("logger")
def test():
for i in range(0,4):
get_logger().info(f"Cost after epoch {epoch}: {epoch_cost}")
以上的logger在循环中会造成可能重复创建并打印:
Cost after epoch 50: 5.575677578305757
Cost after epoch 100: 5.304933032666515
Cost after epoch 100: 5.304933032666515
Cost after epoch 150: 4.901700681548454
Cost after epoch 150: 4.901700681548454
Cost after epoch 150: 4.901700681548454
正确方法:
def get_logger():
if not hasattr(get_logger, "logger"):
no_format_logger = logging.getLogger("logger")
no_format_logger.setLevel(logging.DEBUG)
not_format_file_handler = logging.FileHandler("./costs2.log")
not_format_file_handler.setFormatter(logging.Formatter('%(message)s'))
no_format_logger.addHandler(not_format_file_handler)
get_logger.logger = no_format_logger
return get_logger.logger
hasattr(get_logger, 'logger') 是一个 Python 内置函数 hasattr 的用法,用于检查某个对象是否具有指定的属性。在这个上下文中,它用来检查 get_logger 函数对象是否有 logger 属性。具体来说:
get_logger 是一个函数对象。
'logger' 是我们要检查的属性名称。
条件判断: if not hasattr(get_logger, 'logger') 判断 get_logger 函数是否没有'logger'属性。
这个方法保证了 get_logger 函数在整个应用程序中只创建一个日志记录器实例,即使 get_logger 被多次调用。这样可以避免创建多个日志记录器实例导致的重复日志输出问题。通过 hasattr 检查和 if 条件,我们实现了一个懒加载的单例模式,确保日志记录器实例只创建一次。
207

被折叠的 条评论
为什么被折叠?



