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()) -}