如何在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
相关产品推荐
相关产品推荐

