Select Git revision
environments.pb.go
core.go 1.93 KiB
package zap
import (
"git.perx.ru/perxis/perxis-go/pkg/id"
"git.perx.ru/perxis/perxis-go/pkg/log"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// WriteSyncer отвечает за хранение и синхронизацию log.Entry
type WriteSyncer interface {
Write(entry *log.Entry) error
Sync() error
}
// Core кодирует zapcore.Entry в log.Entry и отправляет их в WriteSyncer
type Core struct {
zapcore.LevelEnabler
WriteSyncer WriteSyncer
fields []zap.Field
}
func (core *Core) With(fields []zapcore.Field) zapcore.Core {
return &Core{
LevelEnabler: core.LevelEnabler,
WriteSyncer: core.WriteSyncer,
fields: append(core.fields, fields...),
}
}
func (core *Core) Check(entry zapcore.Entry, checkedEntry *zapcore.CheckedEntry) *zapcore.CheckedEntry {
if core.Enabled(entry.Level) {
return checkedEntry.AddCore(entry, core)
}
return checkedEntry
}
func (core *Core) Write(entry zapcore.Entry, fields []zapcore.Field) error {
return core.WriteSyncer.Write(core.getEntry(entry, fields))
}
func (core *Core) Sync() error {
return core.WriteSyncer.Sync()
}
func (core *Core) getEntry(entry zapcore.Entry, fields []zapcore.Field) *log.Entry {
if len(core.fields) > 0 {
fields = append(fields, core.fields...)
}
enc := zapcore.NewMapObjectEncoder()
for _, field := range fields {
field.AddTo(enc)
}
ent := &log.Entry{
ID: id.GenerateNewID(),
Timestamp: entry.Time,
LogLevel: log.Level(entry.Level),
Message: entry.Message,
}
ent.Category, _ = enc.Fields["category"].(string)
ent.Component, _ = enc.Fields["component"].(string)
ent.Event, _ = enc.Fields["event"].(string)
ent.Object, _ = enc.Fields["object"].(string)
ent.Caller, _ = enc.Fields["caller"].(string)
ent.Attr = enc.Fields["attr"]
if tags, ok := enc.Fields["tags"].([]any); ok {
for _, item := range tags {
if tag, ok := item.(string); ok {
ent.Tags = append(ent.Tags, tag)
}
}
}
return ent
}