You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cobra中用slog输出至OutOrStdout()/Err()并适配测试重定向?

使用Cobra框架实现结构化日志输出并支持测试重定向的简洁方案

我在使用Cobra框架时,希望所有输出都采用slog结构化日志格式。但有个限制:为了在测试中能通过SetOut()和SetErr()方法捕获输出,所有内容必须通过cmd.OutOrStderr()或cmd.OutOrStdout()这类方法输出(比如fmt.Fprint(cmd.OutOrStderr(), "my output"))。

目前我用了一种可行但步骤繁琐的实现,代码如下:

// 用缓冲区捕获日志输出,再手动通过cmd方法发送
var (
    stdout = bytes.NewBufferString("")
    stderr = bytes.NewBufferString("")
    lout   = slog.New(slog.NewJSONHandler(stdout, nil))
    lerr   = slog.New(slog.NewJSONHandler(stderr, nil))
)

// ... 业务逻辑代码 ...

// 先把日志输出到缓冲区,再重定向到cmd对应的输出流
lout.Info("my stdout output")
sout, _ := io.ReadAll(stdout)
fmt.Fprint(cmd.OutOrStdout(), string(sout))

lerr.Info("my stderr output")
eout, _ := io.ReadAll(stderr)
fmt.Fprint(cmd.OutOrStderr(), string(eout))

测试时我可以这样捕获输出:

b := bytes.NewBufferString("")
cmd.SetOut(b)
cmd.SetErr(b)

这个方案能正常工作,但中间多了缓冲区中转的步骤,显得冗余。我想找更简洁的实现,既能让Cobra的输出都是slog结构化格式,又能在测试中通过SetOut()/SetErr()按需重定向输出。

内容的提问来源于stack exchange,提问作者red888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:40:14