在一个小的Go应用程序中,我正在使用os/exec包来运行命令.目前我通过设置传递日志输出:
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
err := cmd.Run()
Run Code Online (Sandbox Code Playgroud)
我现在要做的是获取日志的输出(特别是第二行的第二行)并将其存储在变量中.我认为这将是为改变容易err := cmd.Run()对cmdOutput, err := cmd.Output()和分析,因为我正在寻找的价值日志字符串-然而,这会触发一个错误说exec: Stdout already set.
我可以删除设置cmd.Stdout,但我仍然希望其余的日志输出以与现在相同的方式传递给当前进程.
我可以控制我正在炮轰的程序,所以如果有更好的方法将子命令/进程的JSON片段发送到父Go应用程序而不是将文件写入磁盘,那也可以.
任何帮助将不胜感激 - 我有点像golang磨砂膏...
你可以和它io.MultiWriter一起使用bytes.Buffer:
var errBuf, outBuf bytes.Buffer
cmd.Stderr = io.MultiWriter(os.Stderr, &errBuf)
cmd.Stdout = io.MultiWriter(os.Stdout, &outBuf)
err := cmd.Run()
Run Code Online (Sandbox Code Playgroud)
这将仍然登录os.Stdout和os.Stderr,但您可以使用errBuf.Bytes()来获取错误输出,并outBuf.Bytes()获得正常输出.outBuf.Bytes()会给你一个等于返回的字节切片cmd.Output().