Python:日志输出(单例模式保证logger实例唯一)

本文详细介绍了如何在Python中利用单例模式确保日志模块的logger实例在整个应用中保持唯一,从而有效地管理和统一输出日志信息。通过这种方式,可以避免在大型项目中因多次初始化logger导致的日志混乱问题。
#!/usr/bin/env python
# coding:UTF-8


"""
@version: python3.x
@author:曹新健
@contact: 617349013@qq.com
@software: PyCharm
@file: 单例模式装饰日志类.py
@time: 2018/10/18 15:10
"""
import os,logging,sys,time

def singleton(cls):
  instances = {}
  def _singleton(*args,**kwargs):
    if cls not in instances:
      instances[cls] = cls(*args,**kwargs)
    return instances[cls]
  return _singleton

@singleton
class Logger():
    def __init__(self,logfile=None):
        self.logger = logging.getLogger()
        formater = logging.Formatter('%(asctime)s %(name)s  %(levelname)s %(filename)s  %(lineno)d '
                        '%(thread)d %(threadName)s %(process)d %(message)s')
        if logfile == None:
            cur_path = os.path.split(os.path.realpath(__file__))[0]
            stime = time.strftime("%Y-%m-%d",time.localtime())
            logfile = cur_path + os.sep + "log_" + stime + ".log"
        else:
            logfile = logfile
        self.
### 实现日志打印到文件的单例模式Python 中,可以使用单例模式实现一个日志记录器,确保只有一个实例负责写入日志文件。以下是一个完整的实现示例,结合了单例模式日志功能。 #### 方法 1:通过重写 `__new__` 方法实现 此方法通过重写 `__new__` 方法来控制类的实例化过程,确保只创建一个实例。 ```python import logging import os class SingletonLogger: _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super().__new__(cls) cls._instance.logger = logging.getLogger("SingletonLogger") cls._instance.logger.setLevel(logging.DEBUG) # 创建文件处理器并设置日志级别 file_handler = logging.FileHandler("logger2.log", mode="w") file_handler.setLevel(logging.DEBUG) # 创建格式化器并应用到处理器 formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") file_handler.setFormatter(formatter) # 将处理器添加到日志记录器 cls._instance.logger.addHandler(file_handler) return cls._instance def info(self, message): self.logger.info(message) def warn(self, message): self.logger.warning(message) # 测试代码 logger1 = SingletonLogger() logger1.info("log1************") logger1.warn("log1************") logger2 = SingletonLogger() logger2.info("log2************") logger2.warn("log2************") print(logger1 is logger2) # 输出:True ``` 在此实现中,`SingletonLogger` 类通过重写 `__new__` 方法确保只创建一个实例[^3]。日志记录器配置为将日志写入 `logger2.log` 文件,并支持多种日志级别(如 `INFO` 和 `WARN`)。 #### 方法 2:使用装饰器实现 另一种方式是使用装饰器来实现单例模式。以下是基于装饰器的实现: ```python import logging def singleton(cls, *args, **kwargs): instances = {} def get_instance(): if cls not in instances: instance = cls(*args, **kwargs) instance.logger = logging.getLogger("SingletonLogger") instance.logger.setLevel(logging.DEBUG) # 创建文件处理器并设置日志级别 file_handler = logging.FileHandler("logger2.log", mode="w") file_handler.setLevel(logging.DEBUG) # 创建格式化器并应用到处理器 formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") file_handler.setFormatter(formatter) # 将处理器添加到日志记录器 instance.logger.addHandler(file_handler) instances[cls] = instance return instances[cls] return get_instance @singleton class Logger: def info(self, message): self.logger.info(message) def warn(self, message): self.logger.warning(message) # 测试代码 logger1 = Logger() logger1.info("log1************") logger1.warn("log1************") logger2 = Logger() logger2.info("log2************") logger2.warn("log2************") print(logger1 is logger2) # 输出:True ``` 在此实现中,装饰器 `singleton` 负责管理类的实例化过程,确保只创建一个实例[^2]。日志记录器的功能与上述方法相同。 ### 日志文件内容 运行上述代码后,`logger2.log` 文件的内容如下: ``` 2023-04-05 12:00:00,000 - INFO - log1************ 2023-04-05 12:00:00,001 - WARNING - log1************ 2023-04-05 12:00:00,002 - INFO - log2************ 2023-04-05 12:00:00,003 - WARNING - log2************ ``` 此实现确保日志记录器为单例模式,所有日志均写入同一个文件[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值