Skip to content
Snippets Groups Projects
Commit e7750115 authored by Semyon Krestyaninov's avatar Semyon Krestyaninov
Browse files

refactor

parent 6a0258b9
No related branches found
No related tags found
No related merge requests found
......@@ -18,55 +18,33 @@ 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,
filters: filters,
}
}
func (core *filterCore) With(fields []zapcore.Field) zapcore.Core {
return &filterCore{
Core: core.Core.With(fields),
filter: core.filter,
filters: core.filters,
fields: append(core.fields, fields...),
}
}
......@@ -83,9 +61,11 @@ func (core *filterCore) Write(entry zapcore.Entry, fields []zapcore.Field) error
fields = append(core.fields, fields...)
}
if !core.filter(entry, fields) {
for _, filter := range core.filters {
if !filter(entry, fields) {
return nil
}
}
return core.Core.Write(entry, fields)
}
......@@ -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())
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment