Skip to content
Snippets Groups Projects
Commit b53c1a71 authored by Alena Petraki's avatar Alena Petraki :nail_care_tone1:
Browse files

Рефакторинг

parent 86ca2e1c
No related branches found
No related tags found
No related merge requests found
......@@ -3,6 +3,7 @@ package zap
import (
"strings"
"git.perx.ru/perxis/perxis-go/pkg/data"
"go.uber.org/zap/zapcore"
)
......@@ -10,13 +11,13 @@ const (
channelKey = "channel"
)
func HasChannel(channel string) FilterFunc {
func ContainsChannels(channels ...string) FilterFunc {
return func(entry zapcore.Entry, fields []zapcore.Field) bool {
for _, f := range fields {
if f.Key == channelKey && f.Type == zapcore.StringType {
list := strings.Split(f.String, ",")
for _, v := range list {
if v == channel {
if data.Contains(v, channels) {
return true
}
}
......@@ -26,22 +27,24 @@ func HasChannel(channel string) FilterFunc {
}
}
// NewDefaultChannelCore аналогичен NewChannelCore, но также устанавливает переданный канал в качестве канала по умолчанию.
// Это означает, что если поле Channel в записи не указано, запись все равно будет передана в zapcore.Core.
func NewDefaultChannelCore(core zapcore.Core, channel string) zapcore.Core {
return NewChannelCore(core, channel, true)
// WithDefaultChannel аналогичен WithChannel, но также устанавливает переданный канал в качестве канала по умолчанию.
// Это означает, что если поле Channels в записи не указано, запись все равно будет передана в zapcore.Core.
func WithDefaultChannel(core zapcore.Core, channel string) zapcore.Core {
return WithChannel(core, channel, true)
}
// NewChannelCore добавляет к переданному Core фильтрацию записей по каналам.
// Это означает, что если запись содержит поле Channel и значение соответствует
// WithChannel добавляет к переданному Core фильтрацию записей по каналам.
// Это означает, что если запись содержит поле Channels и значение соответствует
// переданному каналу, то запись будет передана в zapcore.Core.
func NewChannelCore(core zapcore.Core, channel string, isDefault ...bool) zapcore.Core {
filterFn := HasChannel(channel)
func WithChannel(core zapcore.Core, channel string, isDefault ...bool) zapcore.Core {
filterFn := ContainsChannels(channel)
if len(isDefault) > 0 && isDefault[0] {
filterFn = Or(
HasChannel(channel),
Not(ContainsKey(channelKey)),
)
filterFn = Or(filterFn, Not(ContainsKey(channelKey)))
}
return RegisterFilters(core, filterFn)
return WithFilters(core, filterFn)
}
func WithChannels(core zapcore.Core, channels ...string) zapcore.Core {
filterFn := ContainsChannels(channels...)
return WithFilters(core, filterFn)
}
......@@ -10,12 +10,12 @@ import (
func TestNewChannelCore_WriteSingleChannel(t *testing.T) {
core, logs := observer.New(zapcore.InfoLevel)
core = NewChannelCore(core, "test")
core = WithChannel(core, "test")
err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channel("test")})
err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channels("test")})
require.NoError(t, err)
err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channel("empty")}) // запись не попадет в лог
err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channels("empty")}) // запись не попадет в лог
require.NoError(t, err)
require.Equal(t, 1, logs.Len())
......@@ -25,29 +25,25 @@ func TestNewChannelCore_WriteMultiplyChannels(t *testing.T) {
core, logs := observer.New(zapcore.InfoLevel)
core = zapcore.NewTee(
NewChannelCore(core, "test1"),
NewChannelCore(core, "test2"),
WithChannel(core, "test1"),
WithChannel(core, "test2"),
)
err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channel("test1", "test2")}) // запись попадет сразу в 2 core
require.NoError(t, err)
require.NoError(t, core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channels("test1", "test2")})) // запись попадет сразу в 2 core
require.Equal(t, 2, logs.Len())
}
func TestNewDefaultChannelCore(t *testing.T) {
core, logs := observer.New(zapcore.InfoLevel)
core = NewDefaultChannelCore(core, "test1")
err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channel("test1")})
require.NoError(t, err)
err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channel("test2")}) // эта запись не попадет в лог
require.NoError(t, err)
core = zapcore.NewTee(
WithChannel(core, "test1", true),
WithChannel(core, "test2"),
)
err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{})
require.NoError(t, err)
require.NoError(t, core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channels("test1")}))
require.NoError(t, core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channels("test3")})) // эта запись не попадет в лог
require.NoError(t, core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{}))
require.Equal(t, 2, logs.Len())
}
......@@ -10,7 +10,7 @@ import (
"go.uber.org/zap"
)
func Channel(channels ...string) zap.Field {
func Channels(channels ...string) zap.Field {
return zap.String(channelKey, strings.Join(channels, ","))
}
......
......@@ -56,20 +56,20 @@ type filterCore struct {
fields []zap.Field
}
// RegisterFilters - добавить фильтры, которые будут применяться при записи лога (вызове `core.Write`)
// WithFilters - добавить фильтры, которые будут применяться при записи лога (вызове `core.Write`)
// Метод `core.Write` будет вызван только в случае, когда результат всех фильтров `true`
//
// Обратить внимание, фильтр не применяется к полям, которые были добавлены в `core` через вызов `core.With`
// до вызова RegisterFilters. Пример:
// до вызова WithFilters. Пример:
//
// l, _ := zap.NewDevelopment()
// core := l.Core().With([]zapcore.Field{zap.Int("a", 5)})
// core = RegisterFilters(core, ContainsField(zap.Int("a", 5)))
// core = WithFilters(core, ContainsField(zap.Int("a", 5)))
//
// logger := zap.New(core)
// logger.Info("Test log") // НЕ будет записан
// logger.Info("Test log", zap.Int("a", 5)) // будет записан
func RegisterFilters(core zapcore.Core, filters ...FilterFunc) zapcore.Core {
func WithFilters(core zapcore.Core, filters ...FilterFunc) zapcore.Core {
return &filterCore{
Core: core,
filters: filters,
......
......@@ -11,7 +11,7 @@ import (
func TestFilterCore_Write(t *testing.T) {
core, logs := observer.New(zapcore.InfoLevel)
core = RegisterFilters(core, ContainsField(zap.Bool("check", true)))
core = WithFilters(core, ContainsField(zap.Bool("check", true)))
err := core.With([]zapcore.Field{zap.Bool("check", true)}).Write(zapcore.Entry{Message: "msg"}, nil)
require.NoError(t, err)
......@@ -27,7 +27,7 @@ func TestFilterCore_Write(t *testing.T) {
func TestNotContainsField(t *testing.T) {
core, logs := observer.New(zapcore.InfoLevel)
core = RegisterFilters(core, Not(ContainsField(zap.Int("b", 2))))
core = WithFilters(core, Not(ContainsField(zap.Int("b", 2))))
err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
zap.Int("a", 1),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment