Golang-将Exec输出复制到日志

我想及时重定向过程的输出log。如果我等待过程完成,我可以这样做:

cmd := exec.Command("yes", "Go is awesome") // Prints "Go is awesome", forever 

out, err := cmd.CombinedOutput()

log.Printf("%s", out)

但是,如果该过程花费很长时间或没有完成,则将没有太大用处。我知道我可以像这样实时写入stdout:

cmd := exec.Command("yes")

cmd.Stdout = os.Stdout

cmd.Stderr = os.Stderr

cmd.Run()

但是,这实际上并没有帮助我,因为我正在编写未写入终端的服务。我正在寻找可以让我做类似的事情:

cmd := exec.Command("yes")

cmd.Stdout = log.Stdout

cmd.Stderr = log.Stdout

cmd.Run()

log不能直接访问其作者,因此这是不可能的。当然,我不是唯一遇到这个问题的人,这通常是怎么做的?

回答:

您应该在此处使用管道,例如:

stdout, err := cmd.StdoutPipe()

if err != nil {

return 0, err

}

// start the command after having set up the pipe

if err := cmd.Start(); err != nil {

return 0, err

}

// read command's stdout line by line

in := bufio.NewScanner(stdout)

for in.Scan() {

log.Printf(in.Text()) // write each line to your log, or anything you need

}

if err := in.Err(); err != nil {

log.Printf("error: %s", err)

}

我只Stdout在这里处理过,但是可以同时处理Stderr,例如使用goroutine。

以上是 Golang-将Exec输出复制到日志 的全部内容, 来源链接: utcz.com/qa/408760.html

回到顶部