package log import ( "os" zaplogfmt "github.com/sykesm/zap-logfmt" prettyconsole "github.com/thessem/zap-prettyconsole" "go.uber.org/zap" "go.uber.org/zap/zapcore" "moul.io/zapfilter" ) type Logger struct { logger *zap.SugaredLogger } func (l Logger) DPanic(msg string, rest ...any) { l.logger.DPanicw(msg, rest...) } func (l Logger) Debug(msg string, rest ...any) { l.logger.Debugw(msg, rest...) } func (l Logger) Info(msg string, rest ...any) { l.logger.Infow(msg, rest...) } func (l Logger) Warn(msg string, rest ...any) { l.logger.Warnw(msg, rest...) } func (l Logger) Error(msg string, rest ...any) { l.logger.Errorw(msg, rest...) } func (l Logger) Panic(msg string, rest ...any) { l.logger.Panicw(msg, rest...) } func (l Logger) Fatal(msg string, rest ...any) { l.logger.Fatalw(msg, rest...) } func (l Logger) Named(name string) *Logger { return &Logger{ logger: l.logger.Named(name), } } func (l Logger) With(args ...any) *Logger { return &Logger{ logger: l.logger.With(args...), } } func (l Logger) GetLogger() *zap.Logger { return l.logger.Desugar() } func getLevelFromEnv() (zapcore.Level, error) { if str, found := os.LookupEnv("LOG_LEVEL"); found { l, err := zapcore.ParseLevel(str) return l, err } return zap.InfoLevel, nil } var atom zap.AtomicLevel func Configure(isProduction bool) *Logger { var l *zap.Logger atom = zap.NewAtomicLevel() level, err := getLevelFromEnv() if err != nil { panic(err) } atom.SetLevel(level) if isProduction { cfg := zap.NewProductionEncoderConfig() cfg.TimeKey = "" l = zap.New(zapcore.NewCore(zaplogfmt.NewEncoder(cfg), os.Stderr, atom)) } else { cfg := prettyconsole.NewEncoderConfig() cfg.TimeKey = "" var filter zapfilter.FilterFunc if debug := os.Getenv("DEBUG"); debug != "" { filter = zapfilter.Any(zapfilter.MinimumLevel(level), zapfilter.ByNamespaces(debug)) } else { filter = zapfilter.MinimumLevel(level) } l = zap.New(zapfilter.NewFilteringCore( zapcore.NewCore(prettyconsole.NewEncoder(cfg), os.Stderr, zap.DebugLevel), filter, )) } zap.ReplaceGlobals(l) zap.RedirectStdLog(l) return &Logger{ logger: l.WithOptions(zap.AddCallerSkip(1)).Sugar(), } } func SetLevel(level zapcore.Level) { atom.SetLevel(level) }