import logging import logging.config from logger.constants import ( LEVEL_NAME, BACKUP_COUNT, LOGS_FOLDER, MAX_LOG_FILE_SIZE_BYTES, ) from logger.formatter import JsonFormatter from logger.gunzip_rotating_file_handler import GunZipRotatingFileHandler from logger.filters import LevelFilter, RequestIdFilter from core.singleton import Singleton class LoggerBuilder(metaclass=Singleton): def get_logger(self) -> logging.Logger: logger = logging.getLogger("crm") logger.setLevel(logging.DEBUG) logger.handlers.clear() self.set_handlers(logger) return logger def set_handlers(self, logger: logging.Logger): LOGGER_LEVEL_STEP = 10 for level in range(logging.DEBUG, logging.CRITICAL + 1, LOGGER_LEVEL_STEP): logger.addHandler(self.create_rotating_file_handler(level)) logger.addHandler(self.create_console_handler()) @classmethod def create_rotating_file_handler(cls, level: int) -> GunZipRotatingFileHandler: folder = LOGS_FOLDER / LEVEL_NAME[level] folder.mkdir(parents=True, exist_ok=True) filename = LEVEL_NAME[level] + ".log" file_handler = GunZipRotatingFileHandler( folder / filename, maxBytes=MAX_LOG_FILE_SIZE_BYTES, encoding="UTF-8", backupCount=BACKUP_COUNT[level], ) file_handler.addFilter(LevelFilter(level)) file_handler.addFilter(RequestIdFilter()) file_handler.setFormatter(JsonFormatter()) return file_handler @classmethod def create_console_handler(cls) -> logging.StreamHandler: console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) console_handler.setFormatter(JsonFormatter()) return console_handler logger_builder = LoggerBuilder()