# app/logger.py """ Structured, colorized logger used across the app. - Uses colorlog to add color to log levels in console. - Central logger configuration prevents duplicate handlers. """ import logging import sys from typing import Optional import colorlog from .config import settings def get_logger(name: Optional[str] = None) -> logging.Logger: logger = logging.getLogger(name) if logger.handlers: # already configured return logger # Get level from settings or default to INFO log_level_str = settings.LOG_LEVEL.upper() level = getattr(logging, log_level_str, logging.INFO) # Console Handler with Color handler = colorlog.StreamHandler(stream=sys.stdout) handler.setLevel(level) # Enhanced Formatter with better spacing and colors formatter = colorlog.ColoredFormatter( "%(log_color)s%(levelname)-8s%(reset)s | %(log_color)s%(asctime)s%(reset)s | %(cyan)s%(name)s%(reset)s | %(message)s", datefmt="%H:%M:%S", log_colors={ "DEBUG": "blue", "INFO": "green", "WARNING": "yellow", "ERROR": "bold_red", "CRITICAL": "bold_red,bg_white", }, secondary_log_colors={ "message": { "ERROR": "red", "CRITICAL": "red", } }, style="%" ) handler.setFormatter(formatter) logger.setLevel(level) logger.addHandler(handler) logger.propagate = False return logger # Global app logger logger = get_logger("bge-server")