logger.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import time
  2. import pathlib
  3. from .levels import levels
  4. from .handler import handler
  5. class logger(handler):
  6. def __init__(self, log_file: pathlib.Path | None) -> None:
  7. super().__init__(log_file)
  8. self.__debug = False
  9. self.__time_stamp_format = "%d-%m-%Y %H:%M:%S "
  10. self.__minimum_stdout = levels.critical.value
  11. self.__minimum_stderr = levels.warning.value
  12. self.__minimum_file = levels.warning.value
  13. async def info(self, *args, **kwargs) -> None:
  14. await self.log(levels.info, *args, **kwargs)
  15. async def warning(self, *args, **kwargs) -> None:
  16. await self.log(levels.warning, *args, **kwargs)
  17. async def error(self, *args, **kwargs) -> None:
  18. await self.log(levels.error, *args, **kwargs)
  19. async def critical(self, *args, **kwargs) -> None:
  20. await self.log(levels.critical, *args, **kwargs)
  21. async def log(self, level: levels, *args, **kwargs) -> None:
  22. value = level.value
  23. content = self.__generate(*args, **kwargs)
  24. if value >= self.__minimum_stdout or self.debug:
  25. await self._to_stdout(content)
  26. if value >= self.__minimum_stderr or self.debug:
  27. await self._to_stderr(content)
  28. if value >= self.__minimum_file or self.debug:
  29. await self._to_file(content)
  30. def __generate(self, *args, **kwargs) -> str:
  31. if len(kwargs) > 0:
  32. return self.__generate_from_kwargs(*args, **kwargs)
  33. if len(args) > 0:
  34. return self.__generate_from_args(*args)
  35. raise RuntimeError("Can not log empty message.")
  36. def __generate_from_kwargs(self, *args, **kwargs) -> str:
  37. if len(args) != 1 or type(args[0]) is not str:
  38. RuntimeError("Can not log with format, when format is not given.")
  39. return self.time_stamp + args[0].format(**kwargs)
  40. def __generate_from_args(self, *args) -> str:
  41. mapper = lambda count: count if type(count) is str else repr(count)
  42. mapped = map(mapper, args)
  43. return self.time_stamp + str(", ").join(mapped)
  44. @property
  45. def time_stamp(self) -> str:
  46. return time.strftime(self.__time_stamp_format, time.localtime())
  47. def set_time_stamp(self, target: str) -> None:
  48. self.__time_stamp_format = target
  49. @property
  50. def debug(self) -> bool:
  51. return self.__debug
  52. def start_debugging() -> None:
  53. self.__debug = True
  54. def stop_debugging() -> None:
  55. self.__debug = False