From 278ef8c9910b574c75ae0f279d275aba33b10c4d Mon Sep 17 00:00:00 2001 From: Sergey Chubaryan Date: Sun, 18 Aug 2024 14:55:16 +0300 Subject: [PATCH] add buffered io to logs writer --- src/logger/bufio_wrapper.go | 25 +++++++++++++++++++++++++ src/logger/new.go | 23 +++++++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/logger/bufio_wrapper.go diff --git a/src/logger/bufio_wrapper.go b/src/logger/bufio_wrapper.go new file mode 100644 index 0000000..ecab168 --- /dev/null +++ b/src/logger/bufio_wrapper.go @@ -0,0 +1,25 @@ +package logger + +import ( + "bufio" + "sync" +) + +type BufioWrapper struct { + *bufio.Writer + m *sync.RWMutex +} + +func (b *BufioWrapper) Write(p []byte) (nn int, err error) { + b.m.RLock() + defer b.m.RUnlock() + + return b.Writer.Write(p) +} + +func (b *BufioWrapper) Flush() error { + b.m.Lock() + defer b.m.Unlock() + + return b.Writer.Flush() +} diff --git a/src/logger/new.go b/src/logger/new.go index 7412a12..70ccab8 100644 --- a/src/logger/new.go +++ b/src/logger/new.go @@ -1,8 +1,12 @@ package logger import ( + "bufio" + "context" "io" "os" + "sync" + "time" "github.com/rs/zerolog" ) @@ -38,9 +42,24 @@ func New(opts NewLoggerOpts) (Logger, error) { level = zerolog.DebugLevel } - writer := io.MultiWriter(writers...) + writer := bufio.NewWriterSize(io.MultiWriter(writers...), 32*1024) + wrapper := &BufioWrapper{writer, &sync.RWMutex{}} + go func() { + tmr := time.NewTicker(500 * time.Millisecond) + defer tmr.Stop() - l := zerolog.New(writer).Level(level).With().Timestamp().Logger() + for { + wrapper.Flush() + + select { + case <-context.Background().Done(): + return + case <-tmr.C: + } + } + }() + + l := zerolog.New(wrapper).Level(level).With().Timestamp().Logger() return &logger{ zeroLogger: &l, }, nil