diff --git a/log/zap/filter_core.go b/log/zap/filter_core.go
index cd61487991229e7cdb2df380116c2eb7e43ac471..5d984413ec606ad10308c8a285e0fd425dabc65b 100644
--- a/log/zap/filter_core.go
+++ b/log/zap/filter_core.go
@@ -18,56 +18,34 @@ func HasField(field zapcore.Field) FilterFunc {
 	}
 }
 
-func Or(filters ...FilterFunc) FilterFunc {
+func NotHasField(field zapcore.Field) FilterFunc {
 	return func(entry zapcore.Entry, fields []zapcore.Field) bool {
-		for _, filter := range filters {
-			if filter(entry, fields) {
-				return true
-			}
-		}
-		return false
-	}
-}
-
-func And(filters ...FilterFunc) FilterFunc {
-	return func(entry zapcore.Entry, fields []zapcore.Field) bool {
-		for _, filter := range filters {
-			if !filter(entry, fields) {
-				return false
-			}
-		}
-		return true
-	}
-}
-
-func Not(filter FilterFunc) FilterFunc {
-	return func(entry zapcore.Entry, fields []zapcore.Field) bool {
-		return !filter(entry, fields)
+		return !HasField(field)(entry, fields)
 	}
 }
 
 type filterCore struct {
 	zapcore.Core
 
-	filter FilterFunc
+	filters []FilterFunc
 
 	// fields хранит контекст записей ядра, передаваемых при вызове With.
 	// В методе Write передаются только поля конкретной записи, но мы также хотим учитывать поля контекста ядра.
 	fields []zap.Field
 }
 
-func RegisterFilters(core zapcore.Core, filter FilterFunc) zapcore.Core {
+func RegisterFilters(core zapcore.Core, filters ...FilterFunc) zapcore.Core {
 	return &filterCore{
-		Core:   core,
-		filter: filter,
+		Core:    core,
+		filters: filters,
 	}
 }
 
 func (core *filterCore) With(fields []zapcore.Field) zapcore.Core {
 	return &filterCore{
-		Core:   core.Core.With(fields),
-		filter: core.filter,
-		fields: append(core.fields, fields...),
+		Core:    core.Core.With(fields),
+		filters: core.filters,
+		fields:  append(core.fields, fields...),
 	}
 }
 
@@ -83,8 +61,10 @@ func (core *filterCore) Write(entry zapcore.Entry, fields []zapcore.Field) error
 		fields = append(core.fields, fields...)
 	}
 
-	if !core.filter(entry, fields) {
-		return nil
+	for _, filter := range core.filters {
+		if !filter(entry, fields) {
+			return nil
+		}
 	}
 
 	return core.Core.Write(entry, fields)
diff --git a/log/zap/filter_core_test.go b/log/zap/filter_core_test.go
index 82ed4fba863d1cc55db3381c22914bc468054372..2cf2cf01561ce7ee84a99ed3a420bc6a71026275 100644
--- a/log/zap/filter_core_test.go
+++ b/log/zap/filter_core_test.go
@@ -25,12 +25,9 @@ func TestFilterCore_Write(t *testing.T) {
 	require.Equal(t, 2, logs.Len())
 }
 
-func TestAnd(t *testing.T) {
+func TestNotHasField(t *testing.T) {
 	core, logs := observer.New(zapcore.InfoLevel)
-	core = RegisterFilters(core, And(
-		HasField(zap.Int("a", 1)),
-		HasField(zap.Int("b", 2)),
-	))
+	core = RegisterFilters(core, NotHasField(zap.Int("b", 2)))
 
 	err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
 		zap.Int("a", 1),
@@ -44,44 +41,8 @@ func TestAnd(t *testing.T) {
 	})
 	require.NoError(t, err)
 
-	require.Equal(t, 1, logs.Len())
-}
-
-func TestOr(t *testing.T) {
-	core, logs := observer.New(zapcore.InfoLevel)
-	core = RegisterFilters(core, Or(
-		HasField(zap.Int("a", 1)),
-		HasField(zap.Int("b", 2)),
-	))
-
-	err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
-		zap.Int("a", 1),
-		zap.Int("b", 3),
-	})
-	require.NoError(t, err)
-
-	err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
-		zap.Int("a", 3),
-		zap.Int("b", 2),
-	})
+	err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{})
 	require.NoError(t, err)
 
 	require.Equal(t, 2, logs.Len())
 }
-
-func TestNot(t *testing.T) {
-	core, logs := observer.New(zapcore.InfoLevel)
-	core = RegisterFilters(core, Not(HasField(zap.Int("a", 1))))
-
-	err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
-		zap.Int("a", 1),
-	})
-	require.NoError(t, err)
-
-	err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
-		zap.Int("a", 2),
-	})
-	require.NoError(t, err)
-
-	require.Equal(t, 1, logs.Len())
-}