@@ -47,25 +47,48 @@ def configure_logging(
4747 if logger is None :
4848 logger = logging .getLogger ("fastmcp" )
4949
50- # Only configure the FastMCP logger namespace
50+ formatter = logging .Formatter ("%(message)s" )
51+
52+ # Don't propagate to the root logger
53+ logger .propagate = False
54+ logger .setLevel (level )
55+
56+ # Configure the handler for normal logs
5157 handler = RichHandler (
5258 console = Console (stderr = True ),
53- rich_tracebacks = enable_rich_tracebacks ,
5459 ** rich_kwargs ,
5560 )
56- formatter = logging .Formatter ("%(message)s" )
5761 handler .setFormatter (formatter )
5862
59- logger .setLevel (level )
63+ # filter to exclude tracebacks
64+ handler .addFilter (lambda record : record .exc_info is None )
65+
66+ # Configure the handler for tracebacks, for tracebacks we use a compressed format:
67+ # no path or level name to maximize width available for the traceback
68+ # suppress framework frames and limit the number of frames to 3
69+
70+ import mcp
71+ import pydantic
72+
73+ traceback_handler = RichHandler (
74+ console = Console (stderr = True ),
75+ show_path = False ,
76+ show_level = False ,
77+ rich_tracebacks = enable_rich_tracebacks ,
78+ tracebacks_max_frames = 3 ,
79+ tracebacks_suppress = [fastmcp , mcp , pydantic ],
80+ ** rich_kwargs ,
81+ )
82+ traceback_handler .setFormatter (formatter )
83+
84+ traceback_handler .addFilter (lambda record : record .exc_info is not None )
6085
6186 # Remove any existing handlers to avoid duplicates on reconfiguration
6287 for hdlr in logger .handlers [:]:
6388 logger .removeHandler (hdlr )
6489
6590 logger .addHandler (handler )
66-
67- # Don't propagate to the root logger
68- logger .propagate = False
91+ logger .addHandler (traceback_handler )
6992
7093
7194@contextlib .contextmanager
0 commit comments