import logging import os from logging.handlers import RotatingFileHandler class LoggerConfig: """A class to configure logging for the Flask application.""" LOG_DIR = "logs" # Define the log directory @staticmethod def init_logger(app, production_mode=False): """ Initializes separate log files for INFO, ERROR, and WARNING levels. Args: app: Flask application instance production_mode (bool): If True, disables console output and only logs to files """ # Ensure the logs directory exists if not os.path.exists(LoggerConfig.LOG_DIR): os.makedirs(LoggerConfig.LOG_DIR) # Remove default handlers to prevent duplicate logging for handler in app.logger.handlers[:]: app.logger.removeHandler(handler) # Disable propagation to root logger to prevent console output in production if production_mode: app.logger.propagate = False # Create separate loggers info_handler = LoggerConfig._setup_logger( "info_logger", "info.log", logging.INFO, logging.WARNING ) error_handler = LoggerConfig._setup_logger( "error_logger", "error.log", logging.ERROR, logging.CRITICAL ) warning_handler = LoggerConfig._setup_logger( "warning_logger", "warning.log", logging.WARNING, logging.WARNING ) # Attach handlers to Flask app logger app.logger.addHandler(info_handler) app.logger.addHandler(error_handler) app.logger.addHandler(warning_handler) app.logger.setLevel(logging.DEBUG) # Set lowest level to capture all logs # Add console handler only in development mode if not production_mode: console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) console_formatter = logging.Formatter( "%(asctime)s - %(levelname)s - %(message)s" ) console_handler.setFormatter(console_formatter) app.logger.addHandler(console_handler) app.logger.info("Logger has been initialized for Flask application.") @staticmethod def _setup_logger(name, filename, level, max_level): """Helper method to configure loggers for specific levels.""" logger = logging.getLogger(name) logger.setLevel(level) log_file_path = os.path.join(LoggerConfig.LOG_DIR, filename) log_handler = RotatingFileHandler(log_file_path, maxBytes=100000, backupCount=3) log_handler.setLevel(level) log_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") log_handler.setFormatter(log_formatter) log_handler.addFilter(lambda record: level <= record.levelno <= max_level) logger.addHandler(log_handler) return log_handler