import logging from functools import wraps import sys # Configure logging: writes to file and optionally to console def setup_logger(log_file="agent.log", console: bool = True, level=logging.INFO): logger = logging.getLogger("agent_logger") logger.setLevel(level) # File handler file_handler = logging.FileHandler(log_file) file_handler.setLevel(level) file_formatter = logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) if console: # Console handler console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(level) console_formatter = logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") console_handler.setFormatter(console_formatter) logger.addHandler(console_handler) return logger # Initialize logger (call once in your app) logger = setup_logger() def log_event(event: str, level: int = logging.INFO): """Log an event message at given level.""" logger.log(level, event) def log_function_call(func): """Decorator to log entry, exit and exceptions of a function.""" @wraps(func) def wrapper(*args, **kwargs): logger.info(f"Started: {func.__name__}") try: result = func(*args, **kwargs) logger.info(f"Finished: {func.__name__}") return result except Exception as e: logger.error(f"Exception in {func.__name__}: {e}", exc_info=True) raise return wrapper