如何通过管道将os.Exec的stdout发送到文件,同时也发送到终端?
我已经试过了:
go func() { scanner := bufio.NewScanner(stdout) writer := bufio.NewWriter(logFile) for scanner.Scan() { log.Debugln(scanner.Text()) writer.WriteString(scanner.Text()) } writer.Flush() }()
但是文件writer.WriteString(scanner.Text())丢失\n了。如何让他们回来?也许管道有一些更优雅的解决方案?
writer.WriteString(scanner.Text())
\n
使用参数os.Stdout和文件创建io.MultiWriter。将Cmd.Stdout设置为multiwriter。运行命令。
cmd := exec.Command(name, args...) cmd.Stdout = io.MultiWriter(os.Stdout, file) err := cmd.Run()
如果要逐行写入log.Debugf和其他文件,请执行以下操作:
go func() { scanner := bufio.NewScanner(stdout) writer := bufio.NewWriter(io.MultiWriter(os.Stdout, file)) for scanner.Scan() { log.Debugln(scanner.Text()) writer.Write(scanner.Bytes()) writer.WriteByte('\n') // add line separator } writer.Flush() }()
此代码假定输入中的行分隔符为\ n。