diff --git a/logs/zap/core.go b/logs/zap/core.go
index a6c1c2ecd7e9e2075d4a008bddb4e7911278d64d..aee31e41c7c676d282724b3033c0e364f9400b1b 100644
--- a/logs/zap/core.go
+++ b/logs/zap/core.go
@@ -28,10 +28,12 @@ func NewCore(writeSyncer WriteSyncer) *Core {
 }
 
 func (core *Core) With(fields []zapcore.Field) zapcore.Core {
+	enc := core.enc.Clone()
+	enc.AddFields(fields)
 	return &Core{
 		LevelEnabler: core.LevelEnabler,
 		ws:           core.ws,
-		enc:          core.enc.With(fields),
+		enc:          enc,
 	}
 }
 
diff --git a/logs/zap/entry_encoder.go b/logs/zap/entry_encoder.go
index 62ca529d107ea611332ee89716ddbf625c2234df..d7db9b301a7a41c9b869ddcc0c06146afafe9780 100644
--- a/logs/zap/entry_encoder.go
+++ b/logs/zap/entry_encoder.go
@@ -12,7 +12,8 @@ import (
 )
 
 type Encoder interface {
-	With([]zapcore.Field) Encoder
+	Clone() Encoder
+	AddFields([]zapcore.Field)
 	EncodeEntry(zapcore.Entry, []zapcore.Field) (*logs.Entry, error)
 }
 
@@ -24,12 +25,16 @@ func NewEntryEncoder() Encoder {
 	return &entryEncoder{}
 }
 
-func (enc *entryEncoder) With(fields []zapcore.Field) Encoder {
-	return enc.with(fields)
+func (enc *entryEncoder) AddFields(fields []zapcore.Field) {
+	enc.fields = slices.Concat(enc.fields, fields)
 }
 
-func (enc *entryEncoder) with(fields []zapcore.Field) *entryEncoder {
-	return &entryEncoder{fields: slices.Concat(enc.fields, fields)}
+func (enc *entryEncoder) Clone() Encoder {
+	return enc.clone()
+}
+
+func (enc *entryEncoder) clone() *entryEncoder {
+	return &entryEncoder{fields: slices.Clone(enc.fields)}
 }
 
 func (enc *entryEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*logs.Entry, error) {
@@ -40,7 +45,8 @@ func (enc *entryEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field
 		Message:   entry.Message,
 	}
 
-	clone := enc.with(fields)
+	clone := enc.clone()
+	clone.AddFields(fields)
 
 	for i := range clone.fields {
 		switch clone.fields[i].Key {