import logging

class AIVALogger:
    def __init__(self, log_level=logging.INFO):
        self.logger = logging.getLogger('aiva_logger')
        self.logger.setLevel(log_level)

        # Create handlers
        ch = logging.StreamHandler()
        ch.setLevel(log_level)

        # Create formatter
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

        # Add formatter to handlers
        ch.setFormatter(formatter)

        # Add handlers to the logger
        self.logger.addHandler(ch)

    def log_threshold_breach(self, metric_name, threshold_type, threshold_value, moving_average, scaling_action):
        self.logger.warning(f"Threshold breach: Metric '{metric_name}', Threshold Type '{threshold_type}', Threshold Value '{threshold_value}', Moving Average '{moving_average}', Scaling Action '{scaling_action}'")

    def log_scaling_action_success(self, scaling_action):
        self.logger.info(f"Scaling action '{scaling_action}' executed successfully.")

    def set_log_level(self, log_level):
        self.logger.setLevel(log_level)
        for handler in self.logger.handlers:
            handler.setLevel(log_level)

# Example usage (for testing):
if __name__ == '__main__':
    logger = AIVALogger(logging.DEBUG)
    logger.log_threshold_breach('CPU_Usage', 'Upper', 90, 85, 'Increase CPU Cores')
    logger.log_scaling_action_success('Increase CPU Cores')
    logger.set_log_level(logging.ERROR) # Change log level after initialization
    logger.log_threshold_breach('Memory_Usage', 'Upper', 95, 92, 'Increase RAM') #This won't be logged to console in the example, as level is set to ERROR.
