"""
EnhancePythonLogging
Generated by Eden via recursive self-improvement
2025-11-01 06:34:00.342177
"""

import logging

class EnhancedLogger:
    """
    A class to enhance Python's built-in logging module.
    
    Attributes:
        logger (logging.Logger): The underlying logger instance.
        formatter (logging.Formatter): The formatter for log messages.
        handler_list (list): List of handlers used by the logger.
        
    Methods:
        setup_logger(name, level=logging.INFO, file_name=None):
            Setup a logger with given name and level. Optionally logs to a file.
        add_handler(handler):
            Add a new handler to the logger.
        remove_handler(handler):
            Remove an existing handler from the logger.
        log(message, level=logging.INFO):
            Log a message at the specified level.
    """
    
    def __init__(self, name='EnhancedLogger', level=logging.INFO):
        self.logger = logging.getLogger(name)
        self.formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        self.handler_list = []
        
        # Set the log level
        self.logger.setLevel(level)
    
    def setup_logger(self, name, level=logging.INFO, file_name=None):
        """
        Setup a logger with given name and level. Optionally logs to a file.
        
        Parameters:
            name (str): The name of the logger.
            level (int): The log level. Default is logging.INFO.
            file_name (str): Optional filename for logging to a file.
        """
        handler = logging.StreamHandler()
        if file_name:
            handler = logging.FileHandler(file_name)
        
        handler.setFormatter(self.formatter)
        self.handler_list.append(handler)
        self.logger.addHandler(handler)
    
    def add_handler(self, handler):
        """
        Add a new handler to the logger.
        
        Parameters:
            handler (logging.Handler): The handler to be added.
        """
        if handler not in self.handler_list:
            handler.setFormatter(self.formatter)
            self.handler_list.append(handler)
            self.logger.addHandler(handler)
    
    def remove_handler(self, handler):
        """
        Remove an existing handler from the logger.
        
        Parameters:
            handler (logging.Handler): The handler to be removed.
        """
        if handler in self.handler_list:
            self.logger.removeHandler(handler)
            self.handler_list.remove(handler)
    
    def log(self, message, level=logging.INFO):
        """
        Log a message at the specified level.
        
        Parameters:
            message (str): The message to be logged.
            level (int): The log level. Default is logging.INFO.
        """
        self.logger.log(level, message)

# Example Usage
if __name__ == "__main__":
    logger = EnhancedLogger(name='ExampleLogger')
    logger.setup_logger('console', logging.DEBUG)
    
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.WARNING)
    logger.add_handler(console_handler)
    
    file_handler = logging.FileHandler('example.log')
    file_handler.setLevel(logging.ERROR)
    logger.add_handler(file_handler)
    
    logger.log("This is a debug message", logging.DEBUG)
    logger.log("This is an info message", logging.INFO)
    logger.log("This is a warning message", logging.WARNING)
    logger.log("This is an error message", logging.ERROR)