我zerolog在我的 go 项目中使用包,我需要将内容记录在文件和stdout. 我从这里参考的。我所做的唯一更改是,logger我没有创建名为 的新变量,而是直接影响全局记录器。
runLogFile, _ := os.OpenFile(
"myapp.log",
os.O_APPEND|os.O_CREATE|os.O_WRONLY,
0664,
)
fileLogger := zerolog.New(runLogFile).With().Logger()
multi := zerolog.MultiLevelWriter(os.Stdout, fileLogger)
log.Logger = zerolog.New(multi).With().Timestamp().Logger()
log.Info().Msg("Hello World!")
Run Code Online (Sandbox Code Playgroud)
它在标准输出中生成如下所示的输出,这是预期的。
{"level":"info","time":"2022-09-15T08:10:28-04:00","message":"Hello World!"}
Run Code Online (Sandbox Code Playgroud)
但是,文件内容因额外的消息字段而变得混乱,该消息字段再次包装了上述输出。
{"message":"{\"level\":\"info\",\"time\":\"2022-09-15T08:10:28-04:00\",\"message\":\"Hello World!\"}"}
Run Code Online (Sandbox Code Playgroud)
如何强制 Zerolog 记录内容而无需附加消息字段?
小智 11
MultiLevelWriter接受io.Writer。所以你可以输入runLogFile这个。
最后,代码如下所示:
runLogFile, _ := os.OpenFile(
"myapp.log",
os.O_APPEND|os.O_CREATE|os.O_WRONLY,
0664,
)
multi := zerolog.MultiLevelWriter(os.Stdout, runLogFile)
log.Logger = zerolog.New(multi).With().Timestamp().Logger()
log.Info().Msg("Hello World!")
Run Code Online (Sandbox Code Playgroud)