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 { atom = zap.NewAtomicLevel() level, err := getLevelFromEnv() if err != nil { panic(err) } atom.SetLevel(level) var filter zapfilter.FilterFunc if debug := os.Getenv("DEBUG"); debug != "" { filter = zapfilter.Any(zapfilter.MinimumLevel(level), zapfilter.ByNamespaces(debug)) } else { filter = zapfilter.MinimumLevel(level) } var cfg zapcore.EncoderConfig var enc zapcore.Encoder if isProduction { cfg = zap.NewProductionEncoderConfig() cfg.TimeKey = "" enc = zaplogfmt.NewEncoder(cfg) } else { cfg = prettyconsole.NewEncoderConfig() cfg.TimeKey = "" enc = prettyconsole.NewEncoder(cfg) } log := zap.New( zapfilter.NewFilteringCore(zapcore.NewCore(enc, os.Stderr, zap.DebugLevel), filter), ) zap.ReplaceGlobals(log) zap.RedirectStdLog(log) return &Logger{ logger: log.WithOptions(zap.AddCallerSkip(1)).Sugar(), } } func SetLevel(level zapcore.Level) { atom.SetLevel(level) }