"""
Logging utilities for the application
"""
import logging
import sys
from pathlib import Path
from datetime import datetime
def setup_logger(
name: str,
level: int = logging.INFO,
log_file: str = None,
format_string: str = None
) -> logging.Logger:
"""
Setup a logger with consistent formatting
Args:
name: Logger name
level: Logging level (default: INFO)
log_file: Optional file path to log to
format_string: Optional custom format string
Returns:
Configured logger instance
"""
if format_string is None:
format_string = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
logger = logging.getLogger(name)
logger.setLevel(level)
# Remove existing handlers
logger.handlers.clear()
# Console handler - use stderr for MCP compatibility
console_handler = logging.StreamHandler(sys.stderr)
console_handler.setLevel(level)
console_formatter = logging.Formatter(format_string)
console_handler.setFormatter(console_formatter)
logger.addHandler(console_handler)
# File handler if specified
if log_file:
log_path = Path(log_file)
log_path.parent.mkdir(parents=True, exist_ok=True)
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(level)
file_formatter = logging.Formatter(format_string)
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)
return logger
def get_logger(name: str) -> logging.Logger:
"""
Get an existing logger or create a new one with default settings
Args:
name: Logger name
Returns:
Logger instance
"""
logger = logging.getLogger(name)
# If logger has no handlers, set it up with defaults
if not logger.handlers:
return setup_logger(name)
return logger