1

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

我的方法是写一个写函数

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)

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

4

1 回答 1

3

时间戳未显示在日志文件中的原因是只有您的作者添加时间戳,而不是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包(与 结合io.MultiWriter)为您提供了开箱即用的功能,您可以使用以下方式设置输出编写器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软件包还提供格式化功能和可配置的输出。

于 2021-08-03T09:41:28.227 回答