| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- # -*- coding: utf-8 -*-
- """
- loguru 封装类,导入即可直接使用
- # 当前文件名 logger.py
- """
- import datetime
- import os
- from functools import wraps
- import 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_decorator
- class 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 = 'rpa-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
|