logger_util.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. # -*- coding: utf-8 -*-
  2. """
  3. loguru 封装类,导入即可直接使用
  4. # 当前文件名 logger.py
  5. """
  6. import datetime
  7. import os
  8. from functools import wraps
  9. import loguru
  10. # 单例类的装饰器
  11. def singleton_class_decorator(cls):
  12. """
  13. 装饰器,单例类的装饰器
  14. """
  15. # 在装饰器里定义一个字典,用来存放类的实例。
  16. _instance = {}
  17. # 装饰器,被装饰的类
  18. @wraps(cls)
  19. def wrapper_class(*args, **kwargs):
  20. # 判断,类实例不在类实例的字典里,就重新创建类实例
  21. if cls not in _instance:
  22. # 将新创建的类实例,存入到实例字典中
  23. _instance[cls] = cls(*args, **kwargs)
  24. # 如果实例字典中,存在类实例,直接取出返回类实例
  25. return _instance[cls]
  26. # 返回,装饰器中,被装饰的类函数
  27. return wrapper_class
  28. @singleton_class_decorator
  29. class Logger:
  30. def __init__(self, log_path):
  31. self.logger_add(log_path)
  32. @staticmethod
  33. def get_project_path(project_path=None):
  34. if project_path is None:
  35. # 当前项目文件的,绝对真实路径
  36. # 路径,一个点代表当前目录,两个点代表当前目录的上级目录
  37. project_path = os.path.realpath('.')
  38. # 返回当前项目路径
  39. return project_path
  40. def get_log_path(self, log_path):
  41. # 项目目录
  42. project_path = self.get_project_path(log_path)
  43. # 项目日志目录
  44. project_log_dir = os.path.join(project_path, 'logs')
  45. # 日志文件名
  46. project_log_filename = 'rpa-terminal_{}.log'.format(datetime.date.today())
  47. # 日志文件路径
  48. project_log_path = os.path.join(project_log_dir, project_log_filename)
  49. # 返回日志路径
  50. return project_log_path
  51. def logger_add(self, log_path):
  52. loguru.logger.add(
  53. sink=self.get_log_path(log_path),
  54. # 日志创建周期
  55. rotation='00:00',
  56. # 保存
  57. retention='1 week',
  58. # 文件的压缩格式
  59. compression='zip',
  60. # 编码格式
  61. encoding="utf-8",
  62. # 具有使日志记录调用非阻塞的优点
  63. enqueue=True,
  64. # 详情日志追踪
  65. backtrace=True,
  66. # 打印完整异常
  67. diagnose=True,
  68. # 获取完整的异常
  69. catch=True,
  70. # 日志序列化
  71. serialize=True,
  72. # 日志格式化
  73. format="{time:YYYY-MM-DD HH:mm:ss} {level} From {module}.{function} : {message}"
  74. )
  75. # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。
  76. @property
  77. def get_logger(self):
  78. return loguru.logger