logs_manager.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import pathlib
  2. import time
  3. import typing
  4. from .file_handler import file_handler
  5. from .async_logger import async_logger
  6. from .sync_logger import sync_logger
  7. from .logger import logger
  8. class logs_manager:
  9. def __init__(self, target: pathlib.Path | None = None) -> None:
  10. """
  11. That create new logs manager. It require directory, where logs would
  12. be stored.
  13. Parameters
  14. ----------
  15. target : pathlib.Path
  16. """
  17. if target is None:
  18. target = pathlib.Path("./logs")
  19. if not target.is_dir():
  20. target.mkdir()
  21. self.__root = target
  22. @staticmethod
  23. def _ends_with(name: str, ending: str) -> bool:
  24. """
  25. That check name, and returh True when ends with ending.
  26. Parameters
  27. ----------
  28. name : str
  29. Name to check.
  30. ending : str
  31. Ending to check that name ends with.
  32. Returns
  33. -------
  34. bool
  35. True when name ends with ending.
  36. """
  37. return name[-len(ending):] == ending
  38. @property
  39. def root(self) -> pathlib.Path:
  40. """
  41. Logs directory.
  42. """
  43. return self.__root
  44. @property
  45. def logs(self) -> tuple:
  46. """
  47. That return tuple with all logs.
  48. """
  49. return tuple(self.iter_logs())
  50. def iter_logs(self) -> typing.Iterator[pathlib.Path]:
  51. """
  52. That generator iterate all logs in the log directory.
  53. Returns
  54. -------
  55. typing.Generator[pathlib.Path]
  56. Log files.
  57. """
  58. for count in self.__root.iterdir():
  59. if self._ends_with(count.name, ".log"):
  60. yield self.__root / count
  61. def search_log(self, name: str | None = None) -> tuple:
  62. """
  63. That search for log in the logs directory.
  64. Parameters
  65. ----------
  66. name : str | None
  67. Name to filter logs by. If none, current date.
  68. Returns
  69. -------
  70. tuple
  71. All logs for given name.
  72. """
  73. if name is None:
  74. name = self._base_name
  75. logs = self.iter_logs()
  76. filtered = filter(lambda count: str(count).find(name) != -1, logs)
  77. return tuple(filtered)
  78. @property
  79. def _base_name(self) -> str:
  80. """
  81. That return default base name for current date.
  82. Returns
  83. -------
  84. str
  85. Name for current date.
  86. """
  87. return time.strftime("%Y-%m-%d", time.localtime())
  88. def get_new_file(self) -> pathlib.Path:
  89. """
  90. That generate new log file handler.
  91. Returns
  92. -------
  93. pathlib.Path
  94. New file handler.
  95. """
  96. base_name = self._base_name
  97. name_logs = self.search_log(base_name)
  98. name_count = len(name_logs)
  99. while True:
  100. result_name = (
  101. base_name + "." + \
  102. str(name_count + 1) + ".log" \
  103. )
  104. result_path = self.root / pathlib.Path(result_name)
  105. if not result_path.exists():
  106. return result_path
  107. name_count = name_count + 1
  108. def get_new_handler(self) -> file_handler:
  109. """
  110. That return handler to the new file.
  111. Returns
  112. -------
  113. file_handler
  114. That return new handler to the new log file.
  115. """
  116. return file_handler(self.get_new_file())
  117. def get_logger(self, logger_type : type) -> logger:
  118. """
  119. That return new logger that use new log file.
  120. Parameters
  121. ----------
  122. logger_type : type
  123. Select async_logger or sync_logger.
  124. Returns
  125. -------
  126. logger
  127. New logger that use new log file
  128. """
  129. return logger_type().use_handler(self.get_new_handler())