首页 >后端开发 >Golang >如何将命令输出同时实时重定向到控制台和日志文件?

如何将命令输出同时实时重定向到控制台和日志文件?

Linda Hamilton
Linda Hamilton原创
2024-11-04 07:42:02590浏览

How to Redirect Command Output to Console and Log File Simultaneously in Real Time?

如何将命令输出同时实时重定向到控制台和日志文件

提供的代码将命令的 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn