运行日志
设置 → 运行日志 是 Codeg 内置的诊断日志。界面对它的总结是:“查看和配置应用诊断日志。日志会写入本地文件,并保留在内存中以供实时查看。” 它做两件事:设置 Codeg 记录多少内容,并提供一个实时查看器来读取正在记录的内容 —— 外加一种方式,让你在需要查看器已不再保留的历史时能够访问磁盘上滚动的文件。
每一条记录都会同时进入三个地方,全部由你在这里选择的那一个级别驱动:你终端的 stderr、磁盘上的一个滚动文件,以及查看器读取的一个内存缓冲区。当有什么出问题、而你 —— 或一份缺陷报告 —— 需要看看应用实际在做什么时,就打开这个界面。
日志级别
捕获级别 是总控旋钮 —— “控制捕获多少细节。更高的级别(Debug、Trace)记录得更多,但会产生更大的日志。Off 会禁用日志。” 从下拉框中选择,从最粗到最细:
- Off —— 什么都不捕获。
- Error —— 只记录失败。
- Warning —— 失败和警告。
- Info (默认) —— 正常运行的日常记录。
- Debug / Trace —— 逐级更加详尽,用于追查某个特定问题。日志更大;用完后调回去。
每个级别都包含它上面的一切 —— Info 也会记录警告和错误。这个选择会在你做出的那一刻保存(写入时会短暂显示一个转圈图标)并立即生效,跨所有窗口。
当下拉框变灰时
如果你在启动 Codeg 时设置了 CODEG_LOG 或 RUST_LOG 环境变量,那么该变量拥有对级别的控制权,控件会锁定,并附注 “日志级别由 RUST_LOG / CODEG_LOG 环境变量控制;请在那里更改以使其生效。” CODEG_LOG 优先于 RUST_LOG;把两者都取消设置即可把控制权交回这个界面。它是标准的 Rust 日志开关,因此像 RUST_LOG=codeg_lib::web=debug 这样的指令,其工作方式与下面的按模块覆盖相同。
按模块覆盖
有时你想把某个吵闹的子系统调高,而不必在 Debug 级别下被一切淹没。按模块覆盖 正是做这件事 —— “为特定模块(例如 codeg_lib::acp)设置一个不同的级别,而不改变全局级别。”
添加 会追加一行:一个模块目标和它自己的级别。目标字段会自动补全 Codeg 的主要子系统 ——
codeg_lib::acp—— 智能体协议层(codeg_lib::acp::delegation用于多智能体交接),codeg_lib::web—— web 服务器,codeg_lib::chat_channel—— 聊天频道,codeg_lib::db—— 数据库,
—— 但任何有效的模块路径都会被接受。目标必须形如 name::name::…;格式错误的目标会被标红,并在设置保存时干脆被略去,而不是悄悄破坏过滤器。设置该行的级别,那个模块就会以此级别记录,而全局旋钮保持在你留下的位置。用它的 ✕ 移除一行。和全局级别一样,覆盖各自保存 —— 目标在你点击离开它时保存,级别更改或移除则立即保存。
实时查看器
近期日志 是缓冲区的一段实时输出 —— “近期日志记录的实时视图。可按级别或搜索文本过滤。” 默认情况下,随着新记录到达,它会跟随新记录滚动到底部;向上滚动去读历史,它就会把你留在那里。
工具栏:
- 暂停 / 实时 —— 停止跟随,或恢复实时输出。暂停时,视图静止不动,而日志继续在它后面累积。
- 刷新 —— 从缓冲区重新拉取最新的记录。
- 清空 —— 清空视图。它不会触及文件或缓冲区 —— 刷新 会把记录立刻带回来;它只是一种擦净屏幕、从干净起点观察接下来会发生什么的方式。
- 打开文件夹 (桌面) —— 在你的文件管理器中显示日志目录(见下文)。
在这下面,一个搜索框(匹配消息或目标)和一个级别过滤器 —— 所有级别、Error+、Warning+ 等等 —— 会收窄所显示的内容,并配有一个实时的 “已显示 {shown} / {total}” 计数。
那个过滤器仅影响视图:它改变的是你看到什么,而非 Codeg 记录什么 —— 后者是上面的捕获级别。把视图收窄到 Error+ 并不会阻止 Info 行被捕获;它只是把它们在这里隐藏起来。
每一行显示它的时间(精确到毫秒)、级别(用颜色编码:红色错误、琥珀色警告、蓝色 info、暗淡的 debug 和 trace)、目标模块和消息。携带结构化上下文的行 —— 外层的 span 链和键/值字段 —— 会显示一个 ▸,你可以展开来阅读它们,便于顺着一次请求穿过代码。
查看器在内存中保留最新的约 5,000 条记录(一个滚动缓冲区,同时也有字节上限,因此长时间运行的应用不会无限增长)。较旧的行会滚出缓冲区,但仍留在磁盘上的文件里 —— 这正是下一节的用途。
磁盘上的日志文件
缓冲区只是近期的一段;完整历史存放在文件中。Codeg 每天在 ~/.codeg/logs/(如果你设置了 $CODEG_HOME/logs,则在那里)下写入一个新文件,按二进制文件和日期命名 —— 桌面应用为 codeg.<date>.log,独立服务器为 codeg-server.<date>.log。它们是结构化的 JSON 行,便于用 grep 或通过 jq 处理。Codeg 默认保留最新的 30 个(用 CODEG_LOG_MAX_FILES 覆盖),并清理较旧的。
你如何访问它们取决于你在哪里运行:
- 桌面 —— 查看器工具栏中的 打开文件夹 按钮会在 Finder / Explorer / 你的文件管理器中显示
~/.codeg/logs。直接打开你需要的那一天。 - 在浏览器中 (web 模式或服务器) —— 一个 日志文件 面板会列出机器上的文件及其大小,每个都带一个 下载 按钮,“用于查看实时缓冲区之外的历史。” 单次下载最多返回一个文件最新的 16 MiB;更大的文件会作为一个
.tail.log切片返回并附带提示,而完整的文件仍留在磁盘上。
codeg-mcp 是例外
每次启动的 codeg-mcp 伴随进程只记录到 stderr —— 没有文件、没有缓冲区 —— 因此它永远不会出现在这个界面上。你在这里看到的是桌面应用或服务器本身,而不是它们生成的 MCP 助手。
值得了解
- 一个界面上有两种不同的“级别”。 捕获级别(以及按模块覆盖)决定什么被记录;查看器的级别过滤器和搜索只决定什么被显示。调低捕获以缩小你的日志;用过滤器在不改变任何东西的情况下找到一根针。
- 一切自动保存。 级别和每个覆盖会随你的更改而持久保存 —— 没有保存按钮,只有一个短暂的转圈图标。该设置会跨重启被记住,并在各窗口间实时共享。
- 清空不是删除。 清空 只擦除屏幕上的视图;磁盘上的文件和内存中的缓冲区都不受影响,刷新 会从缓冲区重新填充。
- Debug 和 Trace 各有其用,用完就关。 它们在复现缺陷时无价,其余时间则代价高昂 —— 大文件、更多 I/O。在复现时把级别(或某个单独模块)调高,抓取日志,然后把它调回 Info。
- 环境变量说了算。 如果设置了
CODEG_LOG/RUST_LOG,这个界面就无法更改级别 —— 这是有意为之,以免启动时的指令被悄悄覆盖。清除它才能在这里编辑。