Skip to content

Commit 8b1099d

Browse files
jlowinstrawgate
andauthored
Improve Tracebacks for narrow terminals (#1939)
Co-authored-by: William Easton <[email protected]> Co-authored-by: William Easton <[email protected]>
1 parent 5edcc52 commit 8b1099d

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

src/fastmcp/utilities/logging.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)