| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | # -*- coding: utf-8 -*-"""loguru 封装类,导入即可直接使用# 当前文件名 logger.py"""import datetimeimport osfrom functools import wrapsimport loguru# 单例类的装饰器def singleton_class_decorator(cls):    """    装饰器,单例类的装饰器    """    # 在装饰器里定义一个字典,用来存放类的实例。    _instance = {}    # 装饰器,被装饰的类    @wraps(cls)    def wrapper_class(*args, **kwargs):        # 判断,类实例不在类实例的字典里,就重新创建类实例        if cls not in _instance:            # 将新创建的类实例,存入到实例字典中            _instance[cls] = cls(*args, **kwargs)        # 如果实例字典中,存在类实例,直接取出返回类实例        return _instance[cls]    # 返回,装饰器中,被装饰的类函数    return wrapper_class@singleton_class_decoratorclass Logger:    def __init__(self, log_path):        self.logger_add(log_path)    @staticmethod    def get_project_path(project_path=None):        if project_path is None:            # 当前项目文件的,绝对真实路径            # 路径,一个点代表当前目录,两个点代表当前目录的上级目录            project_path = os.path.realpath('')        # 返回当前项目路径        return project_path    def get_log_path(self, log_path):        # 项目目录        project_path = self.get_project_path(log_path)        # 项目日志目录        project_log_dir = os.path.join(project_path, 'logs')        # 日志文件名        project_log_filename = 'spider-terminal_{}.log'.format(datetime.date.today())        # 日志文件路径        project_log_path = os.path.join(project_log_dir, project_log_filename)        # 返回日志路径        return project_log_path    def logger_add(self, log_path):        loguru.logger.add(            sink=self.get_log_path(log_path),            # 日志创建周期            rotation='00:00',            # 保存            retention='1 week',            # 文件的压缩格式            compression='zip',            # 编码格式            encoding="utf-8",            # 具有使日志记录调用非阻塞的优点            enqueue=True,            # 详情日志追踪            backtrace=True,            # 打印完整异常            diagnose=True,            # 获取完整的异常            catch=True,            # 日志序列化            serialize=True,            # 日志格式化            format="{time:YYYY-MM-DD HH:mm:ss} {level} From {module}.{function} : {message}"        )    # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。    @property    def get_logger(self):        return loguru.logger
 |