有没有办法在 io.multiwriter 中附加时间戳?

Is there a way to append io.multiwriter with timestamp in go?

我正在处理在 go 中生成的日志。使用 io.multiwriterlog := io.MultiWriter(os.Stdout, logfile) 将内容打印到标准输出和日志文件。我想为 os.Stdout 和日志文件添加时间戳。

我的做法是写一个write函数

type writer struct {
    io.Writer
    timeFormat string
}

func (w writer) Write(b []byte) (n int, err error) {
    return w.Writer.Write(append([]byte(time.Now().Format(w.timeFormat)), b...))
}
log := io.MultiWriter(&writer{os.Stdout, "2006/01/02 15:04:05"}, logFile)

但是,它不会在标准输出和日志文件中生成时间戳。有谁知道是否有其他方法可以做到这一点?

时间戳没有出现在日志文件中的原因是因为只有你的作者添加了时间戳,而不是io.MultiWriter()

更改您的用途以将多写入器设置为 writer.Writer,这样时间戳将发送给两个写入器:os.StdoutlogFile

logFile := &bytes.Buffer{}
log := &writer{io.MultiWriter(os.Stdout, logFile), "2006/01/02 15:04:05"}
log.Write([]byte(" hi"))

fmt.Println("\nlogFile:", logFile)

这将输出(在 Go Playground 上尝试):

2009/11/10 23:00:00 hi
logFile: 2009/11/10 23:00:00 hi

还要注意 log package (combined with io.MultiWriter) gives you this functionality out of the box, you can set the output writer using log.SetOutput():

logFile := &bytes.Buffer{}
log.SetOutput(io.MultiWriter(os.Stdout, logFile))
log.Print("hi")

fmt.Println("logFile:", logFile)

输出(在 Go Playground 上尝试):

2009/11/10 23:00:00 hi
logFile: 2009/11/10 23:00:00 hi

此外,log 包还提供格式化功能和可配置的输出。