| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | import timeimport pathlibfrom .levels import levelsfrom .handler import handlerclass logger(handler):    def __init__(self, log_file: pathlib.Path | None) -> None:        super().__init__(log_file)        self.__debug = False        self.__time_stamp_format = "%d-%m-%Y %H:%M:%S "        self.__minimum_stdout = levels.critical.value        self.__minimum_stderr = levels.warning.value        self.__minimum_file = levels.warning.value    async def info(self, *args, **kwargs) -> None:        await self.log(levels.info, *args, **kwargs)    async def warning(self, *args, **kwargs) -> None:        await self.log(levels.warning, *args, **kwargs)    async def error(self, *args, **kwargs) -> None:        await self.log(levels.error, *args, **kwargs)    async def critical(self, *args, **kwargs) -> None:        await self.log(levels.critical, *args, **kwargs)    async def log(self, level: levels, *args, **kwargs) -> None:        value = level.value        content = self.__generate(*args, **kwargs)        if value >= self.__minimum_stdout or self.debug:            await self._to_stdout(content)        if value >= self.__minimum_stderr or self.debug:            await self._to_stderr(content)        if value >= self.__minimum_file or self.debug:            await self._to_file(content)    def __generate(self, *args, **kwargs) -> str:        if len(kwargs) > 0:            return self.__generate_from_kwargs(*args, **kwargs)        if len(args) > 0:            return self.__generate_from_args(*args)                raise RuntimeError("Can not log empty message.")    def __generate_from_kwargs(self, *args, **kwargs) -> str:        if len(args) != 1 or type(args[0]) is not str:            RuntimeError("Can not log with format, when format is not given.")                return self.time_stamp + args[0].format(**kwargs)    def __generate_from_args(self, *args) -> str:        mapper = lambda count: count if type(count) is str else repr(count)        mapped = map(mapper, args)        return self.time_stamp + str(", ").join(mapped)    @property    def time_stamp(self) -> str:        return time.strftime(self.__time_stamp_format, time.localtime())    def set_time_stamp(self, target: str) -> None:            self.__time_stamp_format = target    @property    def debug(self) -> bool:        return self.__debug        def start_debugging() -> None:        self.__debug = True    def stop_debugging() -> None:        self.__debug = False
 |