61 lines
1.8 KiB
Python
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 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()
|