监控与日志用于查看 Sandbox 的运行状态和资源使用,也可以将 Sandbox 内程序打印到 stdout / stderr 的日志采集到日志服务。应用侧可以记录 sandboxId、任务 ID 和命令结果,便于在云上监控或日志页面中定位问题。
该功能通过函数计算和阿里云可观测能力提供,不属于 E2B SDK 的原生接口。
配置入口与生效范围
接入前应先确认监控与日志配置入口和生效范围:
配置入口:以当前云沙箱控制台、函数计算控制台或日志服务配置为准;如果控制台未展示云沙箱日志采集入口,请联系产品支持确认开通方式。
生效范围:确认配置是对账号、地域、模板、Sandbox 还是会话生效,以及是否只影响新创建的 Sandbox。
日志目标:确认日志服务 Project、Logstore、索引字段、保存时间和费用策略。
日志采集边界
配置日志采集后,Sandbox 内程序打印到 stdout / stderr 的日志会被采集到日志服务。如果希望任务日志被云上日志服务检索,应让程序直接输出结构化日志,并带上 sandboxId、任务 ID 等关联字段。
sandbox.commands.run() 返回的 stdout / stderr 仍会返回给业务代码。业务侧如果需要额外沉淀命令摘要、退出码或错误分类,可以在捕获返回结果后截断、脱敏,并作为应用日志输出。
不要把 E2B SDK 的 Sandbox Logs 兼容接口作为生产日志采集入口。生产排查应依赖业务侧结构化日志、函数计算日志采集、云监控和日志服务中的数据。
记录 Sandbox 运行信息
import { Sandbox } from "e2b";
const taskId = crypto.randomUUID();
const sandbox = await Sandbox.create("code-interpreter-v1", {
apiKey: process.env.E2B_API_KEY,
apiUrl: process.env.E2B_API_URL,
domain: process.env.E2B_DOMAIN,
metadata: {
taskId,
},
});
try {
console.log(JSON.stringify({
event: "sandbox_created",
taskId,
sandboxId: sandbox.sandboxId,
}));
const result = await sandbox.commands.run("python3 -V", {
timeoutMs: 30_000,
});
console.log(JSON.stringify({
event: "command_finished",
taskId,
sandboxId: sandbox.sandboxId,
exitCode: result.exitCode,
stdout: result.stdout.trim(),
stderr: result.stderr.trim(),
}));
} finally {
await sandbox.kill();
}Python 示例:
import json
import os
import uuid
from e2b import Sandbox
task_id = str(uuid.uuid4())
sandbox = Sandbox.create(
template="code-interpreter-v1",
api_key=os.environ["E2B_API_KEY"],
api_url=os.environ["E2B_API_URL"],
domain=os.environ["E2B_DOMAIN"],
metadata={
"taskId": task_id,
},
)
try:
print(json.dumps({
"event": "sandbox_created",
"taskId": task_id,
"sandboxId": sandbox.sandbox_id,
}))
result = sandbox.commands.run("python3 -V", timeout=30)
print(json.dumps({
"event": "command_finished",
"taskId": task_id,
"sandboxId": sandbox.sandbox_id,
"exitCode": result.exit_code,
"stdout": result.stdout.strip(),
"stderr": result.stderr.strip(),
}))
finally:
sandbox.kill()输出结构化日志
配置日志采集后,建议输出结构化日志,便于在日志服务中按字段检索。
const result = await sandbox.commands.run(
`python3 - <<'PY'
import json
import os
import time
task_id = os.environ["TASK_ID"]
print(json.dumps({
"event": "task_started",
"taskId": task_id,
"ts": int(time.time()),
}), flush=True)
print(json.dumps({
"event": "task_finished",
"taskId": task_id,
"ts": int(time.time()),
}), flush=True)
PY`,
{
envs: {
TASK_ID: taskId,
},
timeoutMs: 30_000,
}
);
console.log(result.stdout);Python 示例:
result = sandbox.commands.run(
"""
python3 - <<'PY'
import json
import os
import time
task_id = os.environ["TASK_ID"]
print(json.dumps({
"event": "task_started",
"taskId": task_id,
"ts": int(time.time()),
}), flush=True)
print(json.dumps({
"event": "task_finished",
"taskId": task_id,
"ts": int(time.time()),
}), flush=True)
PY
""",
envs={
"TASK_ID": task_id,
},
timeout=30,
)
print(result.stdout)常见观测对象
Sandbox 生命周期:创建、连接、暂停、恢复、终止。
命令执行结果:退出码、stdout、stderr、耗时。
资源使用:CPU、内存、磁盘和网络。
关联字段:
sandboxId、任务 ID、用户或租户标识、模板名称。结构化日志:
event、taskId、sandboxId、exitCode、stdout/stderr摘要。
注意事项
业务系统应保存任务 ID 与
sandboxId的映射。不要把完整 API Key、AccessKey、数据库密码、OAuth Token 写入日志。
长任务建议设置命令超时和 Sandbox 超时。
对日志量大的任务,应控制输出大小,避免日志费用过高。