"""Logging configuration for MCP Server."""
import logging
import sys
from pathlib import Path
from typing import Optional
def setup_logging(log_level: str = "INFO", log_file: Optional[str] = None) -> None:
"""
Configure logging for the MCP Server.
Args:
log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
log_file: Path to log file. Defaults to 'mcp_server.log' in current directory.
"""
# Set up log file path
if log_file is None:
log_file = "mcp_server.log"
log_path = Path(log_file)
log_path.parent.mkdir(parents=True, exist_ok=True)
# Configure logging format
log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
date_format = "%Y-%m-%d %H:%M:%S"
# Convert string level to logging constant
numeric_level = getattr(logging, log_level.upper(), logging.INFO)
# Configure root logger
logging.basicConfig(
level=numeric_level,
format=log_format,
datefmt=date_format,
handlers=[
# Console handler - use stderr to avoid interfering with MCP protocol on stdout
logging.StreamHandler(sys.stderr),
# File handler
logging.FileHandler(log_path, mode="a", encoding="utf-8"),
],
)
# Set levels for third-party libraries to reduce noise
logging.getLogger("uvicorn").setLevel(logging.WARNING)
logging.getLogger("fastapi").setLevel(logging.WARNING)
# Log startup message
logger = logging.getLogger(__name__)
logger.info(f"Logging initialized - Level: {log_level}, File: {log_path}")
def get_logger(name: str) -> logging.Logger:
"""
Get a configured logger instance.
Args:
name: Name for the logger (typically __name__)
Returns:
Configured logger instance
"""
return logging.getLogger(name)