"""Logging configuration for MCP server."""
import logging
import sys
from logging.handlers import RotatingFileHandler
from pathlib import Path
from typing import Optional
from .config import Config, get_config
def setup_logger(name: str, config: Optional[Config] = None) -> logging.Logger:
"""
Set up a logger with file and console handlers.
Note: Console output goes to stderr since stdout is used for MCP protocol.
Args:
name: Logger name
config: Config instance (if None, uses global config)
Returns:
Configured logger
"""
if config is None:
config = get_config()
logger = logging.getLogger(name)
logger.setLevel(config.log_level)
# Prevent duplicate handlers
if logger.handlers:
return logger
# Create formatter
formatter = logging.Formatter(config.log_format)
# File handler with rotation
file_handler = RotatingFileHandler(
config.log_file,
maxBytes=config.get("logging", "max_file_size", default=10) * 1024 * 1024,
backupCount=config.get("logging", "backup_count", default=5),
encoding="utf-8",
)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# Console handler (stderr) - only if enabled
if config.console_output:
console_handler = logging.StreamHandler(sys.stderr)
console_handler.setLevel(config.log_level)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
return logger
def get_logger(name: str) -> logging.Logger:
"""
Get a logger by name. If not already configured, sets it up.
Args:
name: Logger name
Returns:
Logger instance
"""
logger = logging.getLogger(name)
if not logger.handlers:
return setup_logger(name)
return logger