我正在尝试构建一个自定义记录器,它将日志消息保持在缓冲区中的错误级别以下,并且仅在遇到错误后才刷新缓冲区。
问题是我不知道在遇到错误时如何触发将日志刷新到输出(同步方法)。
下面的代码尝试这样做:
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 框架中的Fingers_crossed功能。