import logging import os from logging.handlers import RotatingFileHandler from dotenv import load_dotenv load_dotenv() LOG_ENABLED = os.getenv('LOG_ENABLED', 'true').lower() == 'true' LOG_LEVEL = getattr(logging, os.getenv('LOG_LEVEL', 'DEBUG').upper(), logging.DEBUG) os.makedirs('logs', exist_ok=True) FORMATTER = logging.Formatter( '%(asctime)s | %(levelname)s | %(name)s | %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) def _file_handler(filename: str, level: int) -> RotatingFileHandler: handler = RotatingFileHandler( f'logs/{filename}', maxBytes=5 * 1024 * 1024, backupCount=3, encoding='utf-8' ) handler.setLevel(level) handler.setFormatter(FORMATTER) return handler def _console_handler() -> logging.StreamHandler: handler = logging.StreamHandler() handler.setLevel(logging.INFO) handler.setFormatter(FORMATTER) return handler def get_logger(name: str) -> logging.Logger: logger = logging.getLogger(name) if logger.handlers: return logger if not LOG_ENABLED: logger.addHandler(logging.NullHandler()) return logger logger.setLevel(LOG_LEVEL) logger.addHandler(_file_handler('app.log', LOG_LEVEL)) logger.addHandler(_file_handler('error.log', logging.ERROR)) logger.addHandler(_console_handler()) return logger