"""Logging utilities for Writer MCP."""
import logging
import sys
from typing import Optional
from ..config import settings
def get_logger(name: Optional[str] = None) -> logging.Logger:
"""Get a configured logger instance.
Args:
name: Logger name, defaults to the calling module name
Returns:
Configured logger instance
"""
logger = logging.getLogger(name or __name__)
# Only configure if not already configured
if not logger.handlers:
# Set log level
log_level = getattr(logging, settings.log_level.upper(), logging.INFO)
logger.setLevel(log_level)
# Create console handler
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(log_level)
# Create formatter
if settings.is_development():
# Detailed format for development
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s"
)
else:
# Simpler format for production
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
handler.setFormatter(formatter)
logger.addHandler(handler)
# Prevent propagation to avoid duplicate logs
logger.propagate = False
return logger
def setup_logging() -> None:
"""Setup global logging configuration."""
# Configure root logger
root_logger = logging.getLogger()
# Set log level
log_level = getattr(logging, settings.log_level.upper(), logging.INFO)
root_logger.setLevel(log_level)
# Remove existing handlers
for handler in root_logger.handlers[:]:
root_logger.removeHandler(handler)
# Create console handler
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(log_level)
# Create formatter
if settings.is_development():
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s"
)
else:
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
handler.setFormatter(formatter)
root_logger.addHandler(handler)
# Suppress noisy third-party loggers in production
if settings.is_production():
logging.getLogger("urllib3").setLevel(logging.WARNING)
logging.getLogger("requests").setLevel(logging.WARNING)
logging.getLogger("psycopg2").setLevel(logging.WARNING)