Singleton example:

class LogProvider:
    logger = None
    _lock = threading.Lock()

    @staticmethod
    def _initialize_logger():
        root_dir = get_root_dir()
        log_dir = root_dir + "/" + (getenv("LOGDIR") or "logs")
        log_path = f"{log_dir}/Log.txt"
        if not exists(log_dir):
            mkdir(log_dir)
        format_ = "{asctime} {levelname} {message}"
        basicConfig(filename=log_path, level=DEBUG, format=format_, style="{")
        return getLogger()

    def __new__(cls):
        if cls.logger is None:
            with cls._lock:
                if cls.logger is None:
                    cls.logger = cls._initialize_logger()
        return cls.logger