dsh-logger-channels:为 DSH Profile 提供可见的日志出口

前言

在 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 核实,能力如下:

  1. 命名通道:stderr、stdout、按大小轮转的文件;每个通道可设自己的级别阈值。
  2. 固定行形:每条记录一行,字段顺序为 UTC 时间戳、#sn(每次启动重置的序号)、级别、logger 名、正文。
  3. 配置分层:内置默认 → LOGGER_CHANNELS_* 环境变量 → cordis patch(dsh-logger-channels 的 config.channels);同一键上 config > env > 默认。
  4. 文件轮转:超过 maxBytes 时重命名世代(.1 为最新),保留 keep 代;打开时会根据已有文件大小继续计数,重启后轮转仍连续。
  5. 启动状态:至少声明一个通道时,插件会以 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜