import logging import logging.config from pathlib import Path from typing import Optional def setup_logging( log_level: str = "INFO", log_file: Optional[str] = None, log_format: Optional[str] = None ) -> None: """ Set up logging configuration for the Pokemon agent project. Args: log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) log_file: Optional file path to write logs to log_format: Optional custom log format """ if log_format is None: log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" # Create logs directory if logging to file if log_file: log_path = Path(log_file) log_path.parent.mkdir(parents=True, exist_ok=True) # Configure logging config = { "version": 1, "disable_existing_loggers": False, "formatters": { "standard": { "format": log_format, "datefmt": "%Y-%m-%d %H:%M:%S" }, "detailed": { "format": "%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s", "datefmt": "%Y-%m-%d %H:%M:%S" } }, "handlers": { "console": { "class": "logging.StreamHandler", "level": log_level, "formatter": "standard", "stream": "ext://sys.stdout" } }, "loggers": { "agent": { "level": log_level, "handlers": ["console"], "propagate": True }, "langgraph": { "level": "WARNING", "handlers": ["console"], "propagate": False }, "langchain": { "level": "WARNING", "handlers": ["console"], "propagate": False } }, "root": { "level": log_level, "handlers": ["console"] } } # Add file handler if log_file is specified if log_file: config["handlers"]["file"] = { "class": "logging.handlers.RotatingFileHandler", "level": log_level, "formatter": "detailed", "filename": log_file, "maxBytes": 10485760, # 10MB "backupCount": 5, "encoding": "utf-8" } # Add file handler to all loggers config["loggers"]["agent"]["handlers"].append("file") # Add specific configuration for __main__ case config["loggers"]["agent.__main__"] = { "level": log_level, "handlers": ["console", "file"], "propagate": False } config["root"]["handlers"].append("file") logging.config.dictConfig(config) def get_logger(name: str) -> logging.Logger: """ Get a logger instance for a specific module. Args: name: Logger name (typically __name__) Returns: Configured logger instance """ return logging.getLogger(f"pokemon_agent.{name}")