56 lines
1.4 KiB
Python
56 lines
1.4 KiB
Python
"""Logging utilities for FastMCP."""
|
|
|
|
import logging
|
|
from typing import Literal
|
|
|
|
from rich.console import Console
|
|
from rich.logging import RichHandler
|
|
|
|
|
|
def get_logger(name: str) -> logging.Logger:
|
|
"""Get a logger nested under FastMCP namespace.
|
|
|
|
Args:
|
|
name: the name of the logger, which will be prefixed with 'FastMCP.'
|
|
|
|
Returns:
|
|
a configured logger instance
|
|
"""
|
|
return logging.getLogger(f"FastMCP.{name}")
|
|
|
|
|
|
def configure_logging(
|
|
level: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] | int = "INFO",
|
|
logger: logging.Logger | None = None,
|
|
enable_rich_tracebacks: bool = True,
|
|
) -> None:
|
|
"""
|
|
Configure logging for FastMCP.
|
|
|
|
Args:
|
|
logger: the logger to configure
|
|
level: the log level to use
|
|
"""
|
|
|
|
if logger is None:
|
|
logger = logging.getLogger("FastMCP")
|
|
|
|
# Only configure the FastMCP logger namespace
|
|
handler = RichHandler(
|
|
console=Console(stderr=True),
|
|
rich_tracebacks=enable_rich_tracebacks,
|
|
)
|
|
formatter = logging.Formatter("%(message)s")
|
|
handler.setFormatter(formatter)
|
|
|
|
logger.setLevel(level)
|
|
|
|
# Remove any existing handlers to avoid duplicates on reconfiguration
|
|
for hdlr in logger.handlers[:]:
|
|
logger.removeHandler(hdlr)
|
|
|
|
logger.addHandler(handler)
|
|
|
|
# Don't propagate to the root logger
|
|
logger.propagate = False
|