diff --git a/zap/filter_core.go b/zap/filter_core.go
index 7e99d942e439afc8a05faaf55be29b8cb604b7fc..dee17ba5daf2aaf265207b516028520f08d6ced6 100644
--- a/zap/filter_core.go
+++ b/zap/filter_core.go
@@ -78,7 +78,7 @@ func WithFilters(core zapcore.Core, filters ...FilterFunc) zapcore.Core {
 
 func (core *filterCore) With(fields []zapcore.Field) zapcore.Core {
 	return &filterCore{
-		Core:    core.Core.With(fields),
+		Core:    core.Core,
 		filters: core.filters,
 		fields:  append(core.fields, fields...),
 	}
diff --git a/zap/filter_core_test.go b/zap/filter_core_test.go
index 21c906f24f5b7458c7628985871f1480564a3164..3f25a3f9e2116a3daafa9d75d5238f95204efa46 100644
--- a/zap/filter_core_test.go
+++ b/zap/filter_core_test.go
@@ -9,6 +9,17 @@ import (
 	"go.uber.org/zap/zaptest/observer"
 )
 
+func TestFilterCore_With(t *testing.T) {
+	core, logs := observer.New(zapcore.InfoLevel)
+	core = WithFilters(core)
+
+	err := core.With([]zapcore.Field{zap.String("k", "v")}).Write(zapcore.Entry{Message: "msg"}, nil)
+	require.NoError(t, err)
+
+	require.Len(t, logs.All(), 1)
+	require.Len(t, logs.All()[0].Context, 1)
+}
+
 func TestFilterCore_Write(t *testing.T) {
 	core, logs := observer.New(zapcore.InfoLevel)
 	core = WithFilters(core, ContainsField(zap.Bool("check", true)))