Пользовательский Uber Zap Logger, который пишет в вывод только при обнаружении logger.Error - PullRequest
2 голосов
/ 06 февраля 2020

Я пытаюсь создать настроенный регистратор, который будет хранить сообщения журнала ниже уровня ошибок в буфере и будет 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

...