import sys from src.utils.singleton import Singleton class SysLogger: def __init__(self, filename): self.filename = filename self.terminal = sys.stdout self.log = open(self.filename, "w") def clear(self): self.log.close() self.log = open(self.filename, "w") def get(self): self.terminal.flush() self.log.flush() with open(self.filename, "r") as f: return f.read() def write(self, message): self.terminal.write(message) self.log.write(message + "\n") class Logger: __metaclass__ = Singleton def __init__(self, name: str = "default", safe_history: bool = False): self._name = name self._safe_history = safe_history if self._safe_history: self.sys_logger = SysLogger(f"{self._name}_logs.log") def _log(self, message: str): f_message = (f"{self._name}: " if self._name != "default" else "") + message if self._safe_history: self.sys_logger.write(f_message) else: print(f_message) def clear_history(self): if self._safe_history: self.sys_logger.clear() def get_history(self): if self._safe_history: return self.sys_logger.get() return "" def catch(self, message: str, error): self._log(f"{message} Error: {error}") raise error def debug(self, message: str): self._log(f"debug: {message}") def info(self, message: str): self._log(f"info: {message}") def warn(self, message: str): self._log(f"warn: {message}") def error(self, message: str): self._log(f"error: {message}") def tmp_debug(self, message): self._log(f"tmp_debug: {message}") logger = Logger("default", True)