1. 什么是日志? #
日志(Logging)是 MCP 服务器向客户端发送结构化日志消息的标准化方式。客户端可设置最低日志级别,服务器只发送该级别及以上的日志,便于调试、排错和监控。
协议版本:2025-11-25
| 通俗理解 | 说明 |
|---|---|
| 服务器 → 客户端 | 服务器主动推送日志,客户端展示或持久化 |
| 可过滤 | 客户端设 info 则只收 info/warning/error 等,不收 debug |
| 结构化 | 含级别、记录器名、可 JSON 序列化的 data |
2. 本章你将学到 #
- 日志的能力声明与协议消息
- 如何设置日志级别、接收日志通知
- 日志级别含义与示例
- 错误处理、实现建议与安全要点
3. 典型流程 #
客户端连接服务器后,发送 logging/setLevel 将级别设为 info → 服务器执行操作时,通过 notifications/message 推送 info、warning、error 等日志 → 客户端在控制台或 UI 中展示。若用户只需关注错误,可将级别改为 error,服务器仅发送 error 及以上级别。
4. 能力 #
服务器必须声明 logging 能力:
{
"capabilities": {
"logging": {}
}
}5. 日志级别 #
遵循 RFC 5424 标准 syslog 严重级别,从低到高:
| 级别 | 说明 | 示例 |
|---|---|---|
debug |
详细调试信息 | 函数入口/出口、变量值 |
info |
一般信息 | 操作进度、连接成功 |
notice |
正常但重要 | 配置变更 |
warning |
警告 | 已弃用功能、重试 |
error |
错误 | 操作失败、API 超时 |
critical |
严重 | 组件故障 |
alert |
需立即处理 | 数据损坏 |
emergency |
系统不可用 | 完全故障 |
6. 协议消息 #
6.1 设置日志级别(logging/setLevel) #
客户端可以发送此请求,控制接收哪些级别的日志:
请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "logging/setLevel",
"params": { "level": "info" }
}响应:
{
"jsonrpc": "2.0",
"id": 1,
"result": {}
}6.2 日志消息通知(notifications/message) #
服务器通过通知推送日志,客户端不需回复:
示例:error 级别
{
"jsonrpc": "2.0",
"method": "notifications/message",
"params": {
"level": "error",
"logger": "database",
"data": {
"error": "Connection failed",
"details": { "host": "localhost", "port": 5432 }
}
}
}示例:info 级别
{
"jsonrpc": "2.0",
"method": "notifications/message",
"params": {
"level": "info",
"logger": "tools",
"data": {
"message": "Tool get_weather called",
"args": { "location": "Paris" }
}
}
}示例:debug 级别(仅当客户端设 debug 时收到)
{
"jsonrpc": "2.0",
"method": "notifications/message",
"params": {
"level": "debug",
"logger": "parser",
"data": { "step": "parse_input", "raw": "..." }
}
}| 字段 | 说明 |
|---|---|
level |
日志级别 |
logger |
可选,记录器名称(如 database、tools) |
data |
可选,任意可 JSON 序列化的结构化数据 |
7. 流程示意 #
sequenceDiagram
participant C as 客户端
participant S as 服务器
C->>S: logging/setLevel (info)
S-->>C: result: {}
S-->>C: notifications/message (info)
S-->>C: notifications/message (warning)
S-->>C: notifications/message (error)
C->>S: logging/setLevel (error)
S-->>C: result: {}
Note over S: 此后仅发送 error 及以上
8. 错误处理 #
| 错误码 | 情况 |
|---|---|
-32602 |
无效的日志级别 |
示例:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "Invalid log level: invalid_level"
}
}9. 实现建议 #
| 角色 | 建议 |
|---|---|
| 服务器 | 速率限制;在 data 中包含相关上下文;使用一致的 logger 名称;移除敏感信息 |
| 客户端 | 在 UI 展示;实现过滤/搜索;按级别区分显示(颜色);持久化日志 |
10. 安全要点 #
| 禁止 | 说明 |
|---|---|
| 凭据/密钥 | 日志不得包含密码、API Key 等 |
| 个人身份信息 | 不得包含 PII |
| 内部细节 | 不得暴露可能助长攻击的系统信息 |
| 建议 | 说明 |
|---|---|
| 速率限制 | 对日志消息实施限制 |
| 验证数据 | 验证所有 data 字段 |
| 访问控制 | 控制谁能查看日志 |
| 监控 | 监控敏感内容泄露 |