拓冰建站拓冰建站
首页 / 资讯中心 / 正文

DeepSeek Harness 日志体系:@deepseek-ai/cordis-plugin-logger-console 控制台导出器全解析

DeepSeek Harness 日志体系deepseek-ai/cordis-plugin-logger-console 控制台导出器全解析【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harnessdeepseek-ai/cordis-plugin-logger-console上游为cordisjs/plugin-logger-console在 deepseek-harness 中以 vendor 包形式维护是内置 Cordis Logger 服务的控制台导出器插件。本文以 vendor/logger-console/README.md 为骨架结合 vendor/logger-console/src 源码与 vendor/cordis/src/logger.ts 底层实现完整讲解它的安装用法、全部配置项、Node 与浏览器双入口差异以及渲染管线帮助你理解并定制 DeepSeek Harness 的终端与浏览器日志输出行为。插件定位Cordis 日志体系中的「导出器」Cordis 的日志服务ctx.logger采用**生产者—导出器Exporter**模型业务代码只负责通过命名 logger 产生结构化日志消息Message而消息最终如何呈现写入文件、发送远程、打印到控制台完全由注册的 exporter 决定。vendor/cordis/src/logger.ts 定义了每条消息的结构export interface Message { sn: number // 消息序号 ts: number // 时间戳毫秒 name: string // logger 名称如 app、hmr type: LoggerType // error | info | warn | debug level: number // 数值严重级别 args: any[] // printf 风格的格式化参数 fiber?: WeakRefFiber }而Exporter接口logger.ts只要求实现一个export(message)方法并可选择性提供colors、maxLength、levels、formatters等控制字段。logger-console 插件就是这个模型里负责「把日志渲染成人类可读文本并输出到控制台」的标准导出器。注册方式在 shared.ts 的构造函数中完成ctx.logger.exporter(this)该调用最终通过 logger.ts 的ctx.effect注册到服务内部并在 context 生命周期结束时自动卸载。安装与基础用法在 deepseek-harness 工作区内该包通过 pnpm workspacevendor/*glob直接可用包名为deepseek-ai/cordis-plugin-logger-consolepackage.json。在你自己基于 Cordis 的应用中使用时import { Context } from cordis import ConsoleLogger from deepseek-ai/cordis-plugin-logger-console const root new Context() await root.plugin(ConsoleLogger, { showDiff: true, levels: { default: 2, hmr: 3, }, }) root.logger(app).info(started)这段示例覆盖了三个关键点插件式接入通过root.plugin(ConsoleLogger, config)将导出器挂载到根 Context所有子 context 创建的 logger 都会把消息交给它showDiff: true让每条日志额外显示与上一条消息之间的耗时levels映射default: 2表示默认只导出级别 ≥ WARN 的消息hmr: 3则对名为hmr的 logger 放宽到 DEBUG 级别级别数值见下节。完整配置项详解README 给出了六个配置字段以下是基于 shared.ts 类型定义与 schemastery 校验模式shared.ts的完整说明字段类型默认值说明colorsfalse \| 0 \| 1 \| 2 \| 3Node 入口supports-color检测的终端等级浏览器入口false颜色支持级别false完全禁用 ANSI 颜色maxLengthnumber10240来自 Logger.format 兜底单行渲染最大长度超出部分截断并追加...levelsRecordstring, number无按 logger 名称设置最小导出级别default键作为兜底showDiffbooleanfalse是否显示与上一条消息的时间差showTimestringyyyy-MM-dd hh:mm:ss 时间戳模板cosmokitTime.template语法空字符串可关闭label{ width?, margin?, align? }见下logger 名称标签的宽度、边距与对齐方式其中label为嵌套对象width固定宽度填充、margin标签两侧空格数默认 1、alignleft | right。级别数值与过滤逻辑级别常量定义在 logger.tsERROR 0, INFO 1, WARN 2, DEBUG 3数值越大表示日志越详细。每条消息在发出时logger.ts 会逐 exporter 计算目标阈值const targetLevel exporter.levels?.[this.name] ?? exporter.levels?.default ?? this.level ?? LoggerLevel.INFO if (targetLevel level) continue即优先匹配 exporter 的levels中该 logger 名称的配置 → 其次default→ 再其次 logger 自身的level→ 最后默认INFO(1)。因此 README 示例中default: 2会屏蔽info级别 1消息而hmr: 3会放行hmrlogger 的debug消息。各字段的渲染影响showTime渲染时通过 cosmokit 的Time.template(this.showTime)生成时间戳字符串默认模板输出类似2026-09-20 04:00:42的前缀并用 8 号 ANSI 灰色着色见 shared.tsshowDiff计算message.ts - this.timestamp上一条消息时间用Time.format格式化成12ms这类后缀追加在行尾并以该 logger 的哈希色着色shared.tslabel控制 logger 名称标签的排版——align: right时用padStart右对齐否则用padEnd左对齐shared.ts。渲染管线源码解析Node 入口下每条消息会经过 shared.ts 的render()方法完整渲染流程如下类型前缀取message.type首字母大写包成[I]、[W]、[E]、[D]形式边距按label.margin默认 1生成空格分隔符时间戳若启用showTime追加灰 8 号色的时间串并同步增加换行续行缩进名称标签Logger.code(message.name, this.colors)根据 logger 名称的哈希从调色板挑选颜色logger.ts支持 16 色c16与 256 色c256两套 ANSI 调色板再用Logger.color施加颜色与加粗装饰正文格式化Logger.format(this, message)处理 printf 占位符与剩余参数多行内容按已累计的缩进逐行续行对齐耗时后缀启用showDiff时追加时间差。正文格式化Logger.formatlogger.ts还包含两个实用行为若首个参数是Error自动取error.stack并补%s占位符若首个参数不是字符串自动补%o占位符保证任何调用形式都能被安全渲染内置占位符集为%s %d %i %f %o %O %c %Clogger.ts其中%C用于在正文中嵌入带 logger 名称颜色的代码片段%o/%O由导出器自行覆盖。Node 与浏览器双入口README 特别指出该包存在两套入口源码中体现为三个文件共享实现shared.ts 平台特化index.tsNode/browser.ts浏览器选择逻辑在 package.json 的exports条件中exports: { .: { types: ./lib/types/shared.d.ts, node: ./lib/index.js, default: ./lib/browser.js } }Node 入口index.tsNode 实现 使用node:util.inspect作为%o与%O的格式化器const inspectFormatter: Formatter (value, target) { return inspect(value, { colors: !!target.colors, depth: Infinity, compact: true, breakLength: Infinity }) }colors跟随导出器配置只有终端支持颜色时才给对象输出上色depth: Infinity完整展开嵌套对象compact: true压缩为紧凑单行breakLength: Infinity避免不必要的换行——这与浏览器console的交互式对象展示完全不同colors默认值通过supports-color检测实际终端能力stdout.level取值 0–3做到「接上终端自动配色管道重定向自动降级」。浏览器入口browser.ts浏览器实现 不自行渲染字符串而是把日志参数原样转发给原生consoleexport(message: Message) { const prefix [${message.type[0].toUpperCase()}] ${message.name} const method message.type error ? error : message.type warn ? warn : log consolemethod }这样浏览器开发者工具里对象参数仍是可展开的交互式结构且error/warn消息分别调用console.error/console.warn保留原生堆栈与过滤分组能力。在 deepseek-harness 中的角色与构建形态该包在仓库中属于供应商vendored依赖即上游cordisjs/plugin-logger-console的本地镜像。相关事实重命名映射记录在 docs/rescope.mdcordisjs/plugin-logger-console→deepseek-ai/cordis-plugin-logger-console版本跟随 harness 发布序列vendor 包遵循「必须可发布」约束publishConfig.access: public、不得private: true详见 docs/cookbook/adding-a-vendored-package.md构建采用双入口单次打包由于同时存在 node/browser 两个入口需要独立的 tsdown.config.ts以两次 single-entry 打包把共享基类分别内联进lib/index.js与lib/browser.js而不是拆出 hash 命名的共享 chunk与上游发布形态保持一致依赖关系deepseek-ai/cordispeer、deepseek-ai/cosmokit提供Time模板、deepseek-ai/schemastery提供配置校验、supports-color终端颜色检测Cordis 教程 docs/cordis-tutorial/06-composition-and-hmr.md 在讲解组合与热更新时同样以deepseek-ai/cordis-plugin-logger-console为例注册。值得一提的是vendor/cordis/src/logger.ts 的 LoggerService 本身还内置了一个「缓冲导出器」始终把最近 1000 条消息保留在内存 buffer 中bufferSize 1000。这意味着即使没有任何控制台导出器历史日志依然可被查询或重放而 logger-console 则负责把实时消息呈现给终端用户。实战配置建议开发环境开启showTime与showDiff辅助定位性能热点colors保持默认自动检测即可生产环境Node若日志需要被重定向或归档可将colors显式设为false避免 ANSI 转义污染文件maxLength可调小以限制单行长度、防止恶意超长消息刷屏按模块分级利用levels的default 具名覆盖组合例如「全局只输出 WARN但lsp、subagent等模块输出 DEBUG」浏览器场景如需调试客户端侧日志直接使用默认入口即可获得原生 console 的交互式对象展示无需额外配置。【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门