我有 GoLang 应用程序,我使用 log15 将日志写入文件。我用于 log15 的包是 gopkg.in/inconshreveable/log15.v2 我遇到了一种情况,我想将 STDERR 和 STDOUT 的信息写入我写入 log15 日志的同一文件中。有没有可能的方法来实现相同的目标
最佳答案
您可以使用管道捕获os.Stdout
,并使用io.MultiWriter
将输出重定向到实际的stdout和您的文件
f, _ := os.OpenFile("my.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0664)
multiWriter := io.MultiWriter(os.Stdout, f)
rd, wr, err := os.Pipe()
if err != nil {
os.Exit(1)
}
// overwrite os.Stdout
os.Stdout = wr
go func() {
scanner := bufio.NewScanner(rd)
for scanner.Scan() {
stdoutLine := scanner.Text()
multiWriter.Write([]byte(stdoutLine + "\n"))
}
}()
fmt.Println("foobar")
// hacky sleep to ensure the go routine can write before program exits
time.Sleep(time.Second)
当然,您可以对os.Stderr
应用相同的内容
您必须找到如何获取 log15
文件的句柄,但这应该不会太难
这种方法可能存在的问题是,无法保证 goroutine 在程序结束时会完成其工作(请参阅 sleep 黑客),不确定如何实现这一点
关于GoLang 将 STDOUT 和 STDERR 写入 log15 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51709744/