前言¶
在 DeepSeek Harness(DSH)里跑 profile 时,框架与各插件通过 ctx.logger 写日志,但宿主默认往往只有内存侧的 sink,运维侧看不到完整输出。排查启动失败、插件行为或运行时问题时,只能猜或改代码加打印,成本高且不可复用。
下面介绍社区插件 dsh-logger-channels(维护者 xuan25,分类:客户端):它不改业务逻辑,只注册命名的 stderr、stdout 或按大小轮转的文件通道,把框架与所有插件的 ctx.logger 记录送到操作者能直接看到的地方。
这是什么¶
dsh-logger-channels 是挂在 DSH profile 上的 out-of-tree 插件。一句话:给 profile 一个可见的 log sink——命名通道接收框架与全部插件的每条 ctx.logger 记录,避免日志只停在宿主内存缓冲里。
插件本身不提供 tool 面,也不自带独立配置文件;通道在进程环境变量和/或 cordis 配置层里声明。当前 package 版本为 0.1.0,依赖 @deepseek-ai/cordis(>=4.0.1),许可证 MIT。
核心功能¶
经 README 核实,能力如下:
- 命名通道:
stderr、stdout、按大小轮转的文件;每个通道可设自己的级别阈值。 - 固定行形:每条记录一行,字段顺序为 UTC 时间戳、
#sn(每次启动重置的序号)、级别、logger 名、正文。 - 配置分层:内置默认 →
LOGGER_CHANNELS_*环境变量 → cordis patch(dsh-logger-channels的config.channels);同一键上 config > env > 默认。 - 文件轮转:超过
maxBytes时重命名世代(.1为最新),保留keep代;打开时会根据已有文件大小继续计数,重启后轮转仍连续。 - 启动状态:至少声明一个通道时,插件会以 INFO 打一行,列出各通道名与阈值。
级别数字遵循 cordis 的 verbosity 阶梯(不是 log4j/Python 那套 severity 排序):ERROR=0, INFO=1, WARN=2, DEBUG=3;MINLEVEL / minLevel 表示「该数字及更 verbose 的级别都会输出」,默认阈值为 2(含 warn 及以上 verbosity)。
安装与启用¶
先做安装:在目标 profile 上执行官方命令(勿自行拼接 github:owner/repo):
dsh plugin --profile <name> add dsh-logger-channels
安装后通过环境变量和/或在 cordis.patch.yml(profile 级、~/.dsh/cordis.patch.yml 或 --patch 覆盖)里为插件 id dsh-logger-channels 写 config.channels。配置错误(未知通道类型、file 无 path、越界值等)会在 apply 阶段失败,profile 不会启动。
插件以当前 dsh 进程权限运行;安装前建议阅读 GitHub 仓库 源码并确认 MIT 许可证是否符合你的合规要求。
典型用法¶
环境变量声明通道¶
每个通道必须先有 LOGGER_CHANNELS_<NAME>_TYPE(<NAME> 仅大写字母与数字;通道名为其小写形式,须匹配 ^[a-z][a-z0-9-]{0,31}$)。其余键挂到已声明的通道上,可选。
示例(文件通道,debug verbosity 及以上):
LOGGER_CHANNELS_APP_TYPE=file
LOGGER_CHANNELS_APP_PATH=/<path>
LOGGER_CHANNELS_APP_MINLEVEL=3
常用变量摘要:
| 变量 | 必填 | 含义 |
|---|---|---|
LOGGER_CHANNELS_<NAME>_TYPE |
是 | stderr、stdout 或 file |
LOGGER_CHANNELS_<NAME>_PATH |
file 必填 | 输出路径(父目录会自动创建) |
LOGGER_CHANNELS_<NAME>_MINLEVEL |
否 | 0–3,默认 2 |
LOGGER_CHANNELS_<NAME>_COLORS |
否 | false 或 1–3,默认 false |
LOGGER_CHANNELS_<NAME>_MAXLENGTH |
否 | 单行截断字符数,默认 10240 |
LOGGER_CHANNELS_<NAME>_MAXBYTES |
否 | file 轮转阈值(字节),默认 10485760 |
LOGGER_CHANNELS_<NAME>_KEEP |
否 | 保留的轮转世代数,默认 5 |
未声明 TYPE 的名字上的其它键会被忽略;小写 segment(如 LOGGER_CHANNELS_app_TYPE)不会匹配任何通道。
cordis patch 层¶
可选地在 patch 里写 channels 映射(键均可选)。注意:patch 会整段替换该插件条目的 config,不做 deep merge;只改一个字段时,需要把仍要保留的字段一并写全。
- id: dsh-logger-channels
config:
channels:
app:
channel: file
path: /<path>
minLevel: 3
两层通道取并集;同一通道的同一属性以 config 层为准。
日志行长什么样¶
[2026-10-11T08:01:02.123Z] #42 INFO app Processing: scope=c2c peerId=1
正文里若第一个参数是 Error,会渲染 stack;超长部分受通道 maxLength 限制。
适用场景与注意¶
适合:需要在终端或文件里稳定看到 DSH 与插件运行时日志的开发者与运维;多通道分流(例如 stderr 看 error、file 留全量 debug)。
注意:
- stdout 是共享流:若 profile 用 stdout 承载结构化协议,不要配置
stdout通道,由操作者自行协调流归属。 - 写失败不抛给宿主:某通道因权限、磁盘满、轮转失败而无法写入时会静默并丢弃后续写入,其它通道照常;磁盘满时该通道无输出——应看文件修改时间,不能只看日志流。
- 无通道即无额外 sink 行为:至少声明一个通道后才有可见出口与启动状态行。
DSH 生态强调「一切皆插件」;SkillHub 目录页 是社区站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-logger-channels 把 ctx.logger 从内存侧接到 stderr、stdout 或轮转文件,配置集中在环境变量与 cordis patch,适合作为 profile 的标准日志出口。
- 目录页:https://www.skillhub.cn/plugins/xuan25/dsh-logger-channels
- 源码与说明:https://github.com/xuan25/dsh-logger-channels