如何将命令输出同时实时重定向到控制台和日志文件
提供的代码将命令的 stdout 和 stderr 打印到控制台,但缺乏将其实时记录到文件的能力。本文提出了一种使用 MultiWriter 实现同步日志记录和控制台输出的解决方案,同时遵循以下条件:
之前使用扫描仪、io.Copy 和其他技术的尝试未能维持输出的顺序由于 goroutine 之间存在潜在的竞争条件。
解决方案:使用 MultiWriter
该解决方案利用 io.MultiWriter 类型,它允许同时写入多个目标。下面是修改后的代码:
<code class="go">package main import ( "io" "log" "os" "os/exec" ) func main() { // Logging capability f, err := os.OpenFile("log.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf("Error opening file: %v", err) } defer f.Close() mwriter := io.MultiWriter(f, os.Stdout) cmd := exec.Command("ls") cmd.Stderr = mwriter cmd.Stdout = mwriter err = cmd.Run() //blocks until sub process is complete if err != nil { panic(err) } }</code>
MultiWriter 实例 mwriter 结合了日志文件和标准输出。当为命令指定 Stdout 和 Stderr 时,使用 mwriter 确保控制台输出和日志记录同时发生。
以上是如何将命令输出同时实时重定向到控制台和日志文件?的详细内容。更多信息请关注PHP中文网其他相关文章!