Я пытаюсь создать настроенный регистратор, который будет хранить сообщения журнала ниже уровня ошибок в буфере и будет sh буферизировать только при возникновении ошибки.
Проблема в том, что я не не знаю, как вызвать сброс журналов на выход (метод Syn c) при обнаружении ошибки.
Ниже приведен попытка сделать это.
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 («некоторое информационное сообщение») это сообщение заканчивается в буфере bufio.Writer, и информационное сообщение не отображается
logger.Info («некоторое информационное сообщение2») это сообщение заканчивается в буфере bufio.Writer, и информационное сообщение не отображается
logger.Error («некоторое сообщение об ошибке») только когда при регистрации в журнале ошибки все накопленные журналы из буферизованного должны быть сброшены в выходной файл, на основе приведенного выше примера кода он должен go to os.Stdout
ожидаемый вывод:
some Info message
some Info message2
some Error message
ПРИМЕЧАНИЕ: функционал у, что я пытаюсь достичь, похоже на finger_crossed функция, присутствующая в Php Symfony framework https://symfony.com/doc/current/logging.html#handlers -that-modify-log-records