diff --git a/pkg/log/zap/buffered_write_syncer.go b/pkg/log/zap/buffered_write_syncer.go index ce62ade369595480ed8b649f7c57e2a81b40079f..ecfb53b3a91e725e3f348d9eb32ff1ee542ec162 100644 --- a/pkg/log/zap/buffered_write_syncer.go +++ b/pkg/log/zap/buffered_write_syncer.go @@ -46,11 +46,11 @@ type BufferedWriteSyncer struct { syncQueue chan []*log.Entry flushStop chan struct{} // flushStop закрывается, когда flushLoop должен быть остановлен - started bool // started указывает, был ли выполнен start + started bool // started указывает, был ли выполнен Start stopped bool // stopped указывает, был ли выполнен Stop } -func (ws *BufferedWriteSyncer) start() { +func (ws *BufferedWriteSyncer) Start() { if ws.MaxBufferSize == 0 { ws.MaxBufferSize = defaultMaxBufferSize } @@ -74,24 +74,22 @@ func (ws *BufferedWriteSyncer) start() { ws.started = true } -func (ws *BufferedWriteSyncer) Stop() error { +func (ws *BufferedWriteSyncer) Stop() { ws.mu.Lock() defer ws.mu.Unlock() if !ws.started || ws.stopped { - return nil + return } ws.stopped = true close(ws.flushStop) // завершаем flushLoop - err := ws.flush() // очищаем оставшиеся записи + _ = ws.flush() // очищаем оставшиеся записи close(ws.syncQueue) // завершаем syncLoop ws.wg.Wait() // дожидаемся завершения flushLoop и syncLoop - - return err } // Write отправляет запись в буфер. @@ -101,7 +99,7 @@ func (ws *BufferedWriteSyncer) Write(entry *log.Entry) error { defer ws.mu.Unlock() if !ws.started { - ws.start() + panic("BufferedWriteSyncer must be started") } // Проверяем, не достигли ли мы предела размера буфера. Если это так, тогда освобождаем его. diff --git a/pkg/log/zap/buffered_write_syncer_test.go b/pkg/log/zap/buffered_write_syncer_test.go index 79d3a22def0d779ec5d1be7d52bfac7e9756d604..2e2b64b9a857b9f50c4d623083745edb742c419a 100644 --- a/pkg/log/zap/buffered_write_syncer_test.go +++ b/pkg/log/zap/buffered_write_syncer_test.go @@ -23,6 +23,7 @@ func TestBufferedWriteSyncer_Write(t *testing.T) { Once() ws := &BufferedWriteSyncer{Service: service} + ws.Start() err := ws.Write(&log.Entry{Message: "first log message"}) require.NoError(t, err) @@ -30,8 +31,7 @@ func TestBufferedWriteSyncer_Write(t *testing.T) { err = ws.Write(&log.Entry{Message: "second log message"}) require.NoError(t, err) - err = ws.Stop() - require.NoError(t, err) + ws.Stop() service.AssertExpectations(t) } @@ -47,6 +47,7 @@ func TestBufferedWriteSyncer_Write_Concurrent(t *testing.T) { Once() ws := &BufferedWriteSyncer{Service: service} + ws.Start() var wg sync.WaitGroup for i := 0; i < 100; i++ { @@ -61,8 +62,7 @@ func TestBufferedWriteSyncer_Write_Concurrent(t *testing.T) { wg.Wait() - err := ws.Stop() - require.NoError(t, err) + ws.Stop() service.AssertExpectations(t) } @@ -78,6 +78,7 @@ func TestBufferedWriteSyncer_Flush(t *testing.T) { Times(10) ws := &BufferedWriteSyncer{Service: service} + ws.Start() for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { @@ -88,8 +89,7 @@ func TestBufferedWriteSyncer_Flush(t *testing.T) { assert.NoError(t, err) } - err := ws.Stop() - require.NoError(t, err) + ws.Stop() service.AssertExpectations(t) } @@ -105,14 +105,14 @@ func TestBufferedWriteSyncer_MaxBufferSize(t *testing.T) { Times(10) ws := &BufferedWriteSyncer{Service: service, MaxBufferSize: 10} + ws.Start() for i := 0; i < 100; i++ { err := ws.Write(&log.Entry{Message: "log message"}) require.NoError(t, err) } - err := ws.Stop() - require.NoError(t, err) + ws.Stop() service.AssertExpectations(t) } @@ -128,6 +128,7 @@ func TestBufferedWriteSyncer_FlushInterval(t *testing.T) { Once() ws := &BufferedWriteSyncer{Service: service, FlushInterval: time.Second} + ws.Start() for j := 0; j < 10; j++ { err := ws.Write(&log.Entry{Message: "log message"}) @@ -138,3 +139,10 @@ func TestBufferedWriteSyncer_FlushInterval(t *testing.T) { service.AssertExpectations(t) } + +func TestBufferedWriteSyncer_NotStartedWrite(t *testing.T) { + ws := &BufferedWriteSyncer{} + assert.Panics(t, func() { + _ = ws.Write(&log.Entry{Message: "log message"}) + }) +} diff --git a/pkg/log/zap/zap.go b/pkg/log/zap/zap.go index 43414e6a8b2c190cae33ada6c2920d2fcfbc6a39..acae34a6159c7f0c14ff5827d47a9d9c3c34a0a3 100644 --- a/pkg/log/zap/zap.go +++ b/pkg/log/zap/zap.go @@ -1,14 +1,15 @@ package zap import ( + "git.perx.ru/perxis/perxis-go/pkg/content" "git.perx.ru/perxis/perxis-go/pkg/log" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) -// NewLogLogger создает логгер, который отправляет записи в log.Service, -// вторым параметром возвращается функция, которая должна быть вызвана для остановки логгера. -func NewLogLogger(service log.Service, options ...Option) (*zap.Logger, func() error) { +// New создает логгер, который отправляет записи в log.Service, +// вторым параметром возвращается интерфейс для запуска и остановки логгера +func New(service log.Service, options ...Option) (*zap.Logger, content.Runnable) { cfg := newConfig(options) ws := &BufferedWriteSyncer{ @@ -17,12 +18,12 @@ func NewLogLogger(service log.Service, options ...Option) (*zap.Logger, func() e MaxSyncQueueSize: cfg.maxSyncQueueSize, Service: service, } - return zap.New(&Core{LevelEnabler: zapcore.InfoLevel, WriteSyncer: ws}), ws.Stop + return zap.New(&Core{LevelEnabler: zapcore.InfoLevel, WriteSyncer: ws}), ws } -// WithLogLogger добавляет к переданном логгеру логгер, который отправляет записи в log.Service. -// вторым параметром возвращается функция, которая должна быть вызвана для остановки логгера. -func WithLogLogger(logger *zap.Logger, service log.Service, options ...Option) (*zap.Logger, func() error) { - logLogger, stop := NewLogLogger(service, options...) - return zap.New(zapcore.NewTee(logger.Core(), logLogger.Core())), stop +// WithLogger добавляет к переданном логгеру логгер, который отправляет записи в log.Service. +// вторым параметром возвращается интерфейс для запуска и остановки логгера +func WithLogger(logger *zap.Logger, service log.Service, options ...Option) (*zap.Logger, content.Runnable) { + logLogger, runnable := New(service, options...) + return zap.New(zapcore.NewTee(logger.Core(), logLogger.Core())), runnable } diff --git a/pkg/log/zap/zap_test.go b/pkg/log/zap/zap_test.go index 35fbaf6d372b3a2a50c0dc6ad065ebc9fa4bd55e..31e0566b73fe976196a650a88ee0c11e0b0aba65 100644 --- a/pkg/log/zap/zap_test.go +++ b/pkg/log/zap/zap_test.go @@ -51,7 +51,8 @@ func TestExample(t *testing.T) { }). Once() - logger, stop := NewLogLogger(service) + logger, runnable := New(service) + runnable.Start() logger.Info("создан элемент коллекции", Category("create"), @@ -70,8 +71,7 @@ func TestExample(t *testing.T) { Attr(map[string]map[string]any{"title": {"old": "old title", "new": "new title"}}), ) - err := stop() - assert.NoError(t, err) + runnable.Stop() service.AssertExpectations(t) }