package internal import ( "github.com/flipped-aurora/gin-vue-admin/server/global" "go.uber.org/zap" "go.uber.org/zap/zapcore" "os" "time" ) type ZapCore struct { level zapcore.Level zapcore.Core } func NewZapCore(level zapcore.Level) *ZapCore { entity := &ZapCore{level: level} syncer := entity.WriteSyncer() levelEnabler := zap.LevelEnablerFunc(func(l zapcore.Level) bool { return l == level }) entity.Core = zapcore.NewCore(global.GVA_CONFIG.Zap.Encoder(), syncer, levelEnabler) return entity } func (z *ZapCore) WriteSyncer(formats ...string) zapcore.WriteSyncer { cutter := NewCutter( global.GVA_CONFIG.Zap.Director, z.level.String(), CutterWithLayout(time.DateOnly), CutterWithFormats(formats...), ) if global.GVA_CONFIG.Zap.LogInConsole { multiSyncer := zapcore.NewMultiWriteSyncer(os.Stdout, cutter) return zapcore.AddSync(multiSyncer) } return zapcore.AddSync(cutter) } func (z *ZapCore) Enabled(level zapcore.Level) bool { return z.level == level } func (z *ZapCore) With(fields []zapcore.Field) zapcore.Core { return z.Core.With(fields) } func (z *ZapCore) Check(entry zapcore.Entry, check *zapcore.CheckedEntry) *zapcore.CheckedEntry { if z.Enabled(entry.Level) { return check.AddCore(entry, z) } return check } func (z *ZapCore) Write(entry zapcore.Entry, fields []zapcore.Field) error { for i := 0; i < len(fields); i++ { if fields[i].Key == "business" || fields[i].Key == "folder" || fields[i].Key == "directory" { syncer := z.WriteSyncer(fields[i].String) z.Core = zapcore.NewCore(global.GVA_CONFIG.Zap.Encoder(), syncer, z.level) } } return z.Core.Write(entry, fields) } func (z *ZapCore) Sync() error { return z.Core.Sync() }