Skip to content

沙箱日志

功能迭代中

日志能力目前仍在持续迭代,本文介绍的 cubecli logs 命令是临时使用版本——后续版本可能对接口及底层存储结构进行调整。

CubeSandbox 提供两个互补的日志层:

层级记录内容获取方式
沙箱日志容器 init 进程(主入口)的 stdout/stderrcubecli logs(本文)
envd 任务日志在沙箱内通过 exec 接口启动的子任务的 stdout/stderrE2B SDK(on_stdout / on_stderr 回调)

本文仅介绍沙箱级别的日志envd 子任务的日志获取方式请参阅 E2B SDK 文档

前置条件

cubecli 随 Cubelet 一同构建,并在一键部署时自动安装。logs 子命令访问的日志文件位于 Cubelet 挂载命名空间内,因此必须直接在计算节点上执行,无法通过 API 或非节点主机远程调用。

读取沙箱日志

bash
# 最后 100 行 stdout(默认)
cubecli logs <sandbox-id>

# 最后 100 行 stderr
cubecli logs --stderr <sandbox-id>

# 完整日志(全部行)
cubecli logs --all <sandbox-id>

# 最后 N 行
cubecli logs --tail 50 <sandbox-id>
# 简写
cubecli logs -t 50 <sandbox-id>

# 前 N 行
cubecli logs --head 20 <sandbox-id>
# 简写
cubecli logs -H 20 <sandbox-id>

参数说明

参数简写说明
--stderr-e读取 stderr,默认读取 stdout
--all-a输出全部行;不可与 --tail--head 同时使用
--tail N-t N输出最后 N 行(未指定其他标志时默认为 100)
--head N-H N输出前 N 行

读取模板构建日志

模板构建过程中,容器的 stdout/stderr 会写入宿主机文件系统 /data/log/template/<templateID>_0/。这些文件无需进入 Cubelet 挂载命名空间,使用 --tpl 标志可跳过命名空间切换:

bash
# 最后 100 行模板构建 stdout
cubecli logs --tpl <template-id>

# 完整模板构建 stderr
cubecli logs --tpl --all --stderr <template-id>

日志文件路径

场景路径
沙箱 stdout/data/cubelet/state/io.containerd.runtime.v2.task/default/<sandbox-id>/stdout(Cubelet 挂载命名空间内)
沙箱 stderr/data/cubelet/state/io.containerd.runtime.v2.task/default/<sandbox-id>/stderr(Cubelet 挂载命名空间内)
模板 stdout/data/log/template/<template-id>_0/stdout(宿主机文件系统)
模板 stderr/data/log/template/<template-id>_0/stderr(宿主机文件系统)

为什么需要挂载命名空间?

沙箱日志文件由 CubeShim 写入 bundle 目录,该目录仅在 Cubelet 的私有挂载命名空间内可见。cubecli logs 会在读取前自动重新进入该命名空间——你无需任何额外操作,只需在节点上直接运行该命令即可。

范围与限制

  • 这些日志仅记录 init 进程(容器内 PID 1)的输出。通过 exec 接口启动的进程输出需通过 E2B SDK 的 on_stdout / on_stderr 回调获取,详见 E2B SDK 文档
  • 日志转发需要 v0.4.0 及以上版本的 CubeShim。在更旧的部署上,日志文件将不存在。
  • 日志目前不支持实时流式读取,暂无 --follow 标志。如需查看最新输出,请重新执行命令。
  • 沙箱删除后,对应的日志文件会一并清除。

相关文档