diff --git a/logger.go b/logger.go index 9dad898..65c22ec 100644 --- a/logger.go +++ b/logger.go @@ -181,13 +181,13 @@ func (l *Log) Logx(ctx context.Context, level Level, msg string, fields ...Field if len(l.fn) == 0 { l.log.Log(level, msg, fields...) } else { - tmpFields := fieldPool.Get() - defer fieldPool.Put(tmpFields) + fc := defaultFieldPool.Get() + defer defaultFieldPool.Put(fc) for _, f := range l.fn { - tmpFields = append(tmpFields, f(ctx)) + fc.Fields = append(fc.Fields, f(ctx)) } - tmpFields = append(tmpFields, fields...) - l.log.Log(level, msg, tmpFields...) + fc.Fields = append(fc.Fields, fields...) + l.log.Log(level, msg, fc.Fields...) } } diff --git a/pool.go b/pool.go index 7ec74d8..811a835 100644 --- a/pool.go +++ b/pool.go @@ -6,26 +6,31 @@ import ( "go.uber.org/zap" ) -var fieldPool = newFieldPool() +var defaultFieldPool = newFieldPool() -type innerFieldPool struct { +type fieldContainer struct { + Fields []Field +} + +type fieldPool struct { pool sync.Pool } -func newFieldPool() *innerFieldPool { - return &innerFieldPool{ +func newFieldPool() *fieldPool { + return &fieldPool{ pool: sync.Pool{ New: func() any { - return make([]zap.Field, 0, 16) + return &fieldContainer{make([]zap.Field, 0, 16)} }, }, } } -func (p *innerFieldPool) Get() []zap.Field { - return p.pool.Get().([]zap.Field) +func (p *fieldPool) Get() *fieldContainer { + return p.pool.Get().(*fieldContainer) } -func (p *innerFieldPool) Put(fields []zap.Field) { - p.pool.Put(fields) +func (p *fieldPool) Put(c *fieldContainer) { + c.Fields = c.Fields[:0] + p.pool.Put(c) }