Skip to content

Commit

Permalink
Merge pull request #1253 from edoger/buffer-pool
Browse files Browse the repository at this point in the history
Add support for the logger private buffer pool.
  • Loading branch information
dgsb committed Apr 22, 2021
2 parents fdf1618 + 1818363 commit b50299c
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 12 deletions.
9 changes: 0 additions & 9 deletions buffer_pool.go
Expand Up @@ -26,15 +26,6 @@ func (p *defaultPool) Get() *bytes.Buffer {
return p.pool.Get().(*bytes.Buffer)
}

func getBuffer() *bytes.Buffer {
return bufferPool.Get()
}

func putBuffer(buf *bytes.Buffer) {
buf.Reset()
bufferPool.Put(buf)
}

// SetBufferPool allows to replace the default logrus buffer pool
// to better meets the specific needs of an application.
func SetBufferPool(bp BufferPool) {
Expand Down
14 changes: 11 additions & 3 deletions entry.go
Expand Up @@ -232,18 +232,19 @@ func (entry *Entry) log(level Level, msg string) {

newEntry.Logger.mu.Lock()
reportCaller := newEntry.Logger.ReportCaller
bufPool := newEntry.getBufferPool()
newEntry.Logger.mu.Unlock()

if reportCaller {
newEntry.Caller = getCaller()
}

newEntry.fireHooks()

buffer = getBuffer()
buffer = bufPool.Get()
defer func() {
newEntry.Buffer = nil
putBuffer(buffer)
buffer.Reset()
bufPool.Put(buffer)
}()
buffer.Reset()
newEntry.Buffer = buffer
Expand All @@ -260,6 +261,13 @@ func (entry *Entry) log(level Level, msg string) {
}
}

func (entry *Entry) getBufferPool() (pool BufferPool) {
if entry.Logger.BufferPool != nil {
return entry.Logger.BufferPool
}
return bufferPool
}

func (entry *Entry) fireHooks() {
var tmpHooks LevelHooks
entry.Logger.mu.Lock()
Expand Down
10 changes: 10 additions & 0 deletions logger.go
Expand Up @@ -44,6 +44,9 @@ type Logger struct {
entryPool sync.Pool
// Function to exit the application, defaults to `os.Exit()`
ExitFunc exitFunc
// The buffer pool used to format the log. If it is nil, the default global
// buffer pool will be used.
BufferPool BufferPool
}

type exitFunc func(int)
Expand Down Expand Up @@ -402,3 +405,10 @@ func (logger *Logger) ReplaceHooks(hooks LevelHooks) LevelHooks {
logger.mu.Unlock()
return oldHooks
}

// SetBufferPool sets the logger buffer pool.
func (logger *Logger) SetBufferPool(pool BufferPool) {
logger.mu.Lock()
defer logger.mu.Unlock()
logger.BufferPool = pool
}
28 changes: 28 additions & 0 deletions logger_test.go
Expand Up @@ -67,3 +67,31 @@ func TestWarninglnNotEqualToWarning(t *testing.T) {

assert.NotEqual(t, buf.String(), bufln.String(), "Warning() and Wantingln() should not be equal")
}

type testBufferPool struct {
buffers []*bytes.Buffer
get int
}

func (p *testBufferPool) Get() *bytes.Buffer {
p.get++
return new(bytes.Buffer)
}

func (p *testBufferPool) Put(buf *bytes.Buffer) {
p.buffers = append(p.buffers, buf)
}

func TestLogger_SetBufferPool(t *testing.T) {
out := &bytes.Buffer{}
l := New()
l.SetOutput(out)

pool := new(testBufferPool)
l.SetBufferPool(pool)

l.Info("test")

assert.Equal(t, pool.get, 1, "Logger.SetBufferPool(): The BufferPool.Get() must be called")
assert.Len(t, pool.buffers, 1, "Logger.SetBufferPool(): The BufferPool.Put() must be called")
}

0 comments on commit b50299c

Please sign in to comment.