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

refactor

parent d5f28920
No related branches found
No related tags found
No related merge requests found
......@@ -28,14 +28,10 @@ func NewCore(writeSyncer WriteSyncer) *Core {
}
func (core *Core) With(fields []zapcore.Field) zapcore.Core {
clone := core.enc.Clone()
for i := range fields {
fields[i].AddTo(clone)
}
return &Core{
LevelEnabler: core.LevelEnabler,
ws: core.ws,
enc: clone,
enc: core.enc.With(fields),
}
}
......@@ -47,11 +43,11 @@ func (core *Core) Check(entry zapcore.Entry, checkedEntry *zapcore.CheckedEntry)
}
func (core *Core) Write(entry zapcore.Entry, fields []zapcore.Field) error {
encodeEntry, err := core.enc.EncodeEntry(entry, fields)
encodedEntry, err := core.enc.EncodeEntry(entry, fields)
if err != nil {
return err
}
return core.ws.Write(encodeEntry)
return core.ws.Write(encodedEntry)
}
func (core *Core) Sync() error {
......
......@@ -2,45 +2,37 @@ package zap
import (
"fmt"
"maps"
"slices"
oid "git.perx.ru/perxis/perxis-go/id"
"git.perx.ru/perxis/perxis-go/logs"
"git.perx.ru/perxis/perxis-go/pkg/id"
"git.perx.ru/perxis/perxis-go/zap"
"go.uber.org/zap/zapcore"
)
type Encoder interface {
zapcore.ObjectEncoder
Clone() Encoder
With([]zapcore.Field) Encoder
EncodeEntry(zapcore.Entry, []zapcore.Field) (*logs.Entry, error)
}
type entryEncoder struct {
*zapcore.MapObjectEncoder
fields []zapcore.Field
}
func NewEntryEncoder() Encoder {
return &entryEncoder{MapObjectEncoder: zapcore.NewMapObjectEncoder()}
return &entryEncoder{}
}
func (enc *entryEncoder) Clone() Encoder {
return enc.clone()
func (enc *entryEncoder) With(fields []zapcore.Field) Encoder {
return enc.with(fields)
}
func (enc *entryEncoder) clone() *entryEncoder {
objEnc := zapcore.NewMapObjectEncoder()
maps.Copy(objEnc.Fields, enc.MapObjectEncoder.Fields)
return &entryEncoder{MapObjectEncoder: objEnc}
func (enc *entryEncoder) with(fields []zapcore.Field) *entryEncoder {
return &entryEncoder{fields: slices.Concat(enc.fields, fields)}
}
func (enc *entryEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*logs.Entry, error) {
clone := enc.clone()
for i := range fields {
fields[i].AddTo(clone)
}
ent := &logs.Entry{
ID: id.GenerateNewID(),
Timestamp: entry.Time,
......@@ -48,22 +40,28 @@ func (enc *entryEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field
Message: entry.Message,
}
ent.Category, _ = clone.Fields["category"].(string)
ent.Component, _ = clone.Fields["component"].(string)
ent.Event, _ = clone.Fields["event"].(string)
ent.ObjectID, _ = clone.Fields["object"].(*oid.ObjectId)
ent.CallerID, _ = clone.Fields["caller"].(*oid.ObjectId)
ent.Attr = clone.Fields["attr"]
clone := enc.with(fields)
if err, _ := clone.Fields["error"].(error); err != nil {
for i := range clone.fields {
switch clone.fields[i].Key {
case "category":
ent.Category = clone.fields[i].String
case "component":
ent.Component = clone.fields[i].String
case "event":
ent.Event = clone.fields[i].String
case "object":
ent.ObjectID, _ = clone.fields[i].Interface.(*oid.ObjectId)
case "caller":
ent.CallerID, _ = clone.fields[i].Interface.(*oid.ObjectId)
case "attr":
ent.Attr = clone.fields[i].Interface
case "error":
if err, _ := clone.fields[i].Interface.(error); err != nil {
ent.Message = fmt.Sprintf("%s. Error: %s", ent.Message, err.Error())
}
if tags, ok := clone.Fields["tags"].([]any); ok {
for i := range tags {
if tag, ok := tags[i].(string); ok {
ent.Tags = append(ent.Tags, tag)
}
case "tags":
ent.Tags, _ = clone.fields[i].Interface.(zap.StringArray)
}
}
......
package zap
import (
"fmt"
"testing"
"git.perx.ru/perxis/perxis-go/pkg/items"
logzap "git.perx.ru/perxis/perxis-go/zap"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func BenchmarkSimple(b *testing.B) {
fields := []zapcore.Field{
logzap.Event(items.EventCreateItem),
logzap.Object(items.NewItem("WPNN", "9VGP", "GxNv", "W0fl", nil, nil)),
logzap.Caller("/system"),
logzap.Tags("tag1", "tag2", "tag3"),
}
enc := NewEntryEncoder()
for i := 0; i < b.N; i++ {
_, _ = enc.EncodeEntry(zapcore.Entry{Message: fmt.Sprintf("Msg: %d", i)}, fields)
}
}
func BenchmarkUnknownFields(b *testing.B) {
fields := []zapcore.Field{
logzap.Event(items.EventCreateItem),
logzap.Object(items.NewItem("WPNN", "9VGP", "GxNv", "W0fl", nil, nil)),
logzap.Caller("/system"),
logzap.Tags("tag1", "tag2", "tag3"),
}
for i := 0; i < 1000; i++ {
fields = append(fields, zap.String(fmt.Sprintf("Key: %d", i), fmt.Sprintf("Value: %d", i)))
}
enc := NewEntryEncoder()
for i := 0; i < b.N; i++ {
_, _ = enc.EncodeEntry(zapcore.Entry{Message: fmt.Sprintf("Msg: %d", i)}, fields)
}
}
......@@ -17,7 +17,7 @@ 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.SkipType {
for _, v := range f.Interface.(stringArray) {
for _, v := range f.Interface.(StringArray) {
if data.Contains(v, channels) {
return true
}
......
......@@ -10,9 +10,9 @@ import (
"go.uber.org/zap/zapcore"
)
type stringArray []string
type StringArray []string
func (ss stringArray) MarshalLogArray(arr zapcore.ArrayEncoder) error {
func (ss StringArray) MarshalLogArray(arr zapcore.ArrayEncoder) error {
for i := range ss {
arr.AppendString(ss[i])
}
......@@ -24,7 +24,7 @@ func Channels(channels ...string) zap.Field {
return zap.Field{
Key: channelKey,
Type: zapcore.SkipType, // используем тип zapcore.SkipType, чтобы при кодировании поле игнорировалось
Interface: stringArray(channels),
Interface: StringArray(channels),
}
}
......@@ -64,5 +64,5 @@ func Attr(attr any) zap.Field {
}
func Tags(tags ...string) zap.Field {
return zap.Strings("tags", tags)
return zap.Array("tags", StringArray(tags))
}
......@@ -19,8 +19,8 @@ func TestChannels(t *testing.T) {
field zap.Field
want zap.Field
}{
{name: "ok", field: Channels("master"), want: zap.Field{Key: channelKey, Type: zapcore.SkipType, Interface: stringArray{"master"}}},
{name: "invalid", field: Channels(), want: zap.Field{Key: channelKey, Type: zapcore.SkipType, Interface: stringArray(nil)}},
{name: "ok", field: Channels("master"), want: zap.Field{Key: channelKey, Type: zapcore.SkipType, Interface: StringArray{"master"}}},
{name: "invalid", field: Channels(), want: zap.Field{Key: channelKey, Type: zapcore.SkipType, Interface: StringArray(nil)}},
}
for _, tc := range tests {
......@@ -208,13 +208,13 @@ func TestTags(t *testing.T) {
field zap.Field
want zap.Field
}{
{name: "ok", field: Tags("a", "b", "c"), want: zap.Strings("tags", []string{"a", "b", "c"})},
{name: "invalid", field: Tags(nil...), want: zap.Strings("tags", nil)},
{name: "ok", field: Tags("a", "b", "c"), want: zap.Array("tags", StringArray([]string{"a", "b", "c"}))},
{name: "invalid", field: Tags(nil...), want: zap.Array("tags", StringArray(nil))},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
assert.True(t, tc.want.Equals(tc.field))
assert.Equal(t, tc.want, tc.field)
})
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment