mod_log.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. """
  2. Логгер для всех сервисов
  3. """
  4. import time
  5. import inspect
  6. from types import FrameType
  7. class Logger:
  8. """
  9. Логгер для всех сервисов на python
  10. """
  11. def __init__(self, prefix: str) -> None:
  12. self.__pref = prefix
  13. """Префикс для каждого частного логгера"""
  14. def __call__(self, msg: str) -> None:
  15. """Печатает сообщение отладки"""
  16. _pref = ""
  17. try:
  18. frame = inspect.currentframe()
  19. if isinstance(frame, FrameType):
  20. # Получаем фрейм вызывающей функции
  21. caller_frame: FrameType | None = frame.f_back
  22. if isinstance(caller_frame, FrameType):
  23. # Имя функции
  24. _pref = caller_frame.f_code.co_name
  25. del frame
  26. del caller_frame
  27. _pref = self.__pre(_pref)
  28. except TypeError:
  29. _pref = self.__pref + ": "
  30. print(f"DEBU {self.__now()} {_pref}{msg}")
  31. def debug(self, msg: str) -> None:
  32. """Печатает сообщение отладки"""
  33. _pref = ""
  34. try:
  35. frame = inspect.currentframe()
  36. if isinstance(frame, FrameType):
  37. # Получаем фрейм вызывающей функции
  38. caller_frame: FrameType | None = frame.f_back
  39. if isinstance(caller_frame, FrameType):
  40. # Имя функции
  41. _pref = caller_frame.f_code.co_name
  42. del frame
  43. del caller_frame
  44. _pref = self.__pre(_pref)
  45. except TypeError:
  46. _pref = self.__pref + ": "
  47. print(f"DEBU {self.__now()} {_pref}{msg}")
  48. def error(self, msg: str) -> None:
  49. """Печатает сообщение ошибки"""
  50. _pref = ""
  51. try:
  52. frame = inspect.currentframe()
  53. if isinstance(frame, FrameType):
  54. # Получаем фрейм вызывающей функции
  55. caller_frame: FrameType | None = frame.f_back
  56. if isinstance(caller_frame, FrameType):
  57. # Имя функции
  58. _pref = caller_frame.f_code.co_name
  59. del frame
  60. del caller_frame
  61. _pref = self.__pre(_pref)
  62. except TypeError:
  63. _pref = self.__pref + ": "
  64. print(f"ERRO {self.__now()} {_pref}{msg}")
  65. def warn(self, msg: str) -> None:
  66. """Печатает сообщение предупреждения"""
  67. _pref = ""
  68. try:
  69. frame = inspect.currentframe()
  70. if isinstance(frame, FrameType):
  71. # Получаем фрейм вызывающей функции
  72. caller_frame: FrameType | None = frame.f_back
  73. if isinstance(caller_frame, FrameType):
  74. # Имя функции
  75. _pref = caller_frame.f_code.co_name
  76. del frame
  77. del caller_frame
  78. _pref = self.__pre(_pref)
  79. except TypeError:
  80. _pref = self.__pref + ": "
  81. print(f"WARN {self.__now()} {_pref}{msg}")
  82. def __now(self) -> str:
  83. """Возвращает текущее время с миллисекундами
  84. в формате %Y-%m-%d %H:%M:%S.%f"""
  85. timestamp = time.time()
  86. ms = int(timestamp * 1000) % 1000
  87. _time = f"%Y-%m-%d %H:%M:%S.{ms:03d}"
  88. return time.strftime(_time, time.localtime())
  89. def __pre(self, fn_name: str) -> str:
  90. """Получить имя вызвавшей функции"""
  91. # Имя функции
  92. # Также можно получить:
  93. # - имя файла: caller_frame.f_code.co_filename
  94. # - номер строки: caller_frame.f_lineno
  95. # - локальные переменные: caller_frame.f_locals
  96. # Очищаем ссылки на фреймы (важно для сборки мусора)
  97. pref: str = self.__pref + "." + fn_name + "(): "
  98. return pref