是否有办法追加io.多写入器与时间戳在去?



我正在处理在go中生成的日志。使用io将内容打印到标准输出和日志文件。多写器log := io.MultiWriter(os.Stdout, logfile)。我想给两个操作系统都添加时间戳。标准输出和日志文件。

我的方法是写一个写函数
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包(与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包还提供格式化功能和可配置的输出。

最新更新