【问题标题】:How to process stderr in go?go中如何处理stderr?
【发布时间】:2014-07-08 17:40:26
【问题描述】:

我有一个名为“myapp”的应用程序。该应用程序只是写入标准错误。

重要的是,我想捕获 stderr 中写入的内容并实时处理它。我该怎么做呢?

我尝试了下面的代码。 :

cmd := exec.Command("myapp") // this app prints lines to stderr
stderr, err := cmd.StderrPipe()
if err != nil {
    log.Fatal(err)
}

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

if b, err := ioutil.ReadAll(stderr); err == nil {
    log.Println(string(b))
}                                                                                                       

if err := cmd.Wait(); err != nil {
    log.Fatal(err)
}   

代码没有打印出来。我怀疑这是因为 ioutil.ReadAll() 不是正确调用的函数,因为它等待 EOF。我还能如何从 stderr 管道中读取数据?

您可以将执行的命令替换为输出到 stdout 或 stderr 的任何内容,例如 tail -f mylogfile。关键是,我想在将这些行写入标准输出时对其进行处理。

【问题讨论】:

  • 你是如何处理它的?
  • @iliacholy 我计划将每一行发布到 REST API。
  • 我这样做的方式是实际使用 bash |管道并使其他应用程序为输入中的每一行发送一个休息命令
  • @fabrizioM 我认为这是正确的做法
  • @rexposadas cnicutar 的解决方案就是你想要的。

标签: go


【解决方案1】:

StderrPipe 返回一个ReadCloser。您可以使用它来创建bufio.Scanner,然后逐行读取:

sc := bufio.NewScanner(stderr)
for sc.Scan() {
    fmt.Printf("Line: %s\n", sc.Text());
}

【讨论】:

    【解决方案2】:

    创建一个实现io.Writer 的类型并将其设置为command's stderr 编写器。

    type Processor struct{}
    
    func (Processor) Write(b []byte) (int, error) {
        // intercept data here
        return os.Stdout.Write(b)
    }
    
    func main() {
        cmd := exec.Command("mycommand")
        cmd.Stderr = Processor{}
        _ = cmd.Run()
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-26
      • 1970-01-01
      • 2023-01-20
      • 2013-05-04
      • 2015-07-18
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2021-11-08
      相关资源
      最近更新 更多