Files
Crm-Backend/logger/builder.py
2025-10-31 11:29:24 +04:00

61 lines
1.8 KiB
Python

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 utils.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()