登录
首页 >  Golang >  Go问答

Golang - 将 Exec 输出复制到日志

来源:Golang技术栈

时间:2023-03-26 08:23:49 207浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Golang - 将 Exec 输出复制到日志》,聊聊golang,我们一起来看看吧!

问题内容

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

cmd := exec.Command("yes", "Go is awesome") // Prints "Go is awesome", forever 
out, err := cmd.CombinedOutput()
log.Printf("%s", out)

但是,如果该过程需要很长时间或未完成,则此方法的用处不大。我知道我可以像这样实时写入标准输出:

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 输出复制到日志》的详细内容,更多关于golang的资料请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表