python单例模式logger

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 条件,我们实现了一个懒加载的单例模式,确保日志记录器实例只创建一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值