mirror of
https://github.com/PrefectHQ/fastmcp.git
synced 2026-08-21 04:54:17 +02:00
76 lines
No EOL
2.1 KiB
Text
76 lines
No EOL
2.1 KiB
Text
---
|
|
title: Server Logging
|
|
sidebarTitle: Logging
|
|
description: Receive and handle log messages from MCP servers.
|
|
icon: receipt
|
|
---
|
|
|
|
import { VersionBadge } from '/snippets/version-badge.mdx'
|
|
|
|
<VersionBadge version="2.0.0" />
|
|
|
|
MCP servers can emit log messages to clients. The client can handle these logs through a log handler callback.
|
|
|
|
## Log Handler
|
|
|
|
Provide a `log_handler` function when creating the client:
|
|
|
|
```python
|
|
from fastmcp import Client
|
|
from fastmcp.client.logging import LogMessage
|
|
|
|
async def log_handler(message: LogMessage):
|
|
level = message.level.upper()
|
|
logger = message.logger or 'server'
|
|
data = message.data
|
|
print(f"[{level}] {logger}: {data}")
|
|
|
|
client = Client(
|
|
"my_mcp_server.py",
|
|
log_handler=log_handler,
|
|
)
|
|
```
|
|
|
|
### Handler Parameters
|
|
|
|
The `log_handler` is called every time a log message is received. It receives a `LogMessage` object:
|
|
|
|
<Card icon="code" title="Log Handler Parameters">
|
|
<ResponseField name="LogMessage" type="Log Message Object">
|
|
<Expandable title="attributes">
|
|
<ResponseField name="level" type='Literal["debug", "info", "notice", "warning", "error", "critical", "alert", "emergency"]'>
|
|
The log level
|
|
</ResponseField>
|
|
|
|
<ResponseField name="logger" type="str | None">
|
|
The logger name (optional, may be None)
|
|
</ResponseField>
|
|
|
|
<ResponseField name="data" type="Any">
|
|
The actual log message content
|
|
</ResponseField>
|
|
</Expandable>
|
|
</ResponseField>
|
|
</Card>
|
|
|
|
```python
|
|
async def detailed_log_handler(message: LogMessage):
|
|
if message.level == "error":
|
|
print(f"ERROR: {message.data}")
|
|
elif message.level == "warning":
|
|
print(f"WARNING: {message.data}")
|
|
else:
|
|
print(f"{message.level.upper()}: {message.data}")
|
|
```
|
|
|
|
## Default Log Handling
|
|
|
|
If you don't provide a custom `log_handler`, FastMCP uses a default handler that emits a DEBUG-level FastMCP log for every log message received from the server, which is useful for visibility without polluting your own logs.
|
|
|
|
```python
|
|
client = Client("my_mcp_server.py")
|
|
|
|
async with client:
|
|
# Server logs will be emitted at DEBUG level automatically
|
|
await client.call_tool("some_tool")
|
|
``` |