【发布时间】:2020-05-22 06:20:47
【问题描述】:
我正在尝试构建一个自定义记录器,它将日志消息保持在缓冲区中的错误级别以下,并且仅在遇到错误后才刷新缓冲区。
问题是我不知道遇到错误时如何触发将日志刷新到输出(同步方法)。
下面的代码是这样做的一个尝试:
func CustomLogger() {
// First, define our level-handling logic.
lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl < activationLevel
})
//define the output of the logs
customWriteSyncer := Buffer(os.Stdout)
consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
//creates a Core that writes logs to a WriteSyncer
core := zapcore.NewCore(consoleEncoder, customWriteSyncer, lowPriority)
logger := zap.New(core)
defer logger.Sync()
Logger = logger
}
type BufferWriterSync struct {
buf *bufio.Writer
}
func Buffer(ws zapcore.WriteSyncer) zapcore.WriteSyncer {
bw := &BufferWriterSync{
buf: bufio.NewWriter(ws),
}
ws = zapcore.Lock(bw)
return ws
}
// Sync syncs data to output
func (w BufferWriterSync) Sync() error {
return w.buf.Flush()
}
// Write writes data to buffer
func (w BufferWriterSync) Write(p []byte) (int, error) {
return w.buf.Write(p)
}
例如,执行时:
-
logger.Info("some Info message")此消息最终在bufio.Writer的缓冲区中,并且Info消息不显示 -
logger.Info("some Info message2")这条消息在bufio.Writer的缓冲区中结束,Info消息不显示 -
logger.Error("some Error message")仅在遇到错误记录时必须将缓冲中的所有累积日志刷新到输出,根据上面的代码示例,它应该转到os.Stdout
预期输出:
some Info message
some Info message2
some Error message
注意: 我试图实现的功能类似于 Php Symfony framework 中的 fingers_crossed 功能。
【问题讨论】: