import logging import os import verboselogs import platformdirs import constants class LoggerManager: def __init__(self, console_level: int = logging.INFO): self.logger = verboselogs.VerboseLogger(constants.APP_NAME) self.logger.setLevel(logging.DEBUG) self.file_formatter = logging.Formatter( '[%(asctime)s] [PID %(process)s] [%(levelname)7s]: %(message)s' ) self.info_file_formatter = logging.Formatter( '[%(asctime)s] [PID %(process)s]: %(message)s' ) self.console_formatter = logging.Formatter( '[%(levelname)7s]: %(message)s' ) self.nothing_formatter = logging.Formatter( '%(message)s' ) self.console_handler = logging.StreamHandler() self.console_handler.setLevel(console_level) self.console_handler.setFormatter(self.nothing_formatter) log_dir = platformdirs.user_log_dir(constants.APP_NAME) os.makedirs(log_dir, exist_ok=True) self.debug_file_handler = logging.FileHandler(log_dir + "/debug_log.txt") self.debug_file_handler.setFormatter(self.file_formatter) self.debug_file_handler.setLevel(logging.DEBUG) self.verbose_file_handler = logging.FileHandler(log_dir + "/verbose_log.txt") self.verbose_file_handler.setFormatter(self.file_formatter) self.verbose_file_handler.setLevel(verboselogs.VERBOSE) self.info_file_handler = logging.FileHandler(log_dir + "/log.txt") self.info_file_handler.setFormatter(self.info_file_formatter) self.info_file_handler.setLevel(logging.INFO) self.logger.addHandler(self.console_handler) self.logger.addHandler(self.debug_file_handler) self.logger.addHandler(self.verbose_file_handler) self.logger.addHandler(self.info_file_handler) def set_console_level(self, level: int): self.console_handler.setLevel(level) if level == logging.INFO: self.console_handler.setFormatter(self.nothing_formatter) else: self.console_handler.setFormatter(self.console_formatter) def is_console_level_active(self, level: int): return level >= self.console_handler.level def get_logger(self): return self.logger # Global logger instance logger_manager = LoggerManager() logger = logger_manager.get_logger()