Select Git revision
spaces.proto
entry_encoder.go 1.98 KiB
package zap
import (
"fmt"
"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 {
Clone() Encoder
AddFields([]zapcore.Field)
EncodeEntry(zapcore.Entry, []zapcore.Field) (*logs.Entry, error)
}
type entryEncoder struct {
fields []zapcore.Field
}
func NewEntryEncoder() Encoder {
return &entryEncoder{}
}
func (enc *entryEncoder) AddFields(fields []zapcore.Field) {
enc.fields = slices.Concat(enc.fields, fields)
}
func (enc *entryEncoder) Clone() Encoder {
return enc.clone()
}
func (enc *entryEncoder) clone() *entryEncoder {
return &entryEncoder{fields: slices.Clone(enc.fields)}
}
func (enc *entryEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*logs.Entry, error) {
ent := &logs.Entry{
ID: id.GenerateNewID(),
Timestamp: entry.Time,
Level: logs.Level(entry.Level),
Message: entry.Message,
}
clone := enc.clone()
clone.AddFields(fields)
for i := range clone.fields {
switch clone.fields[i].Key {
// При добавлении новых полей стоит учитывать, как zap хранит значения в структуре Field.
// Например:
// zap.Bool хранит bool как 1/0 в поле Field.Integer
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())
}
case "tags":
ent.Tags, _ = clone.fields[i].Interface.(zap.StringArray)
}
}
return ent, nil
}