package logger import ( "os" "strings" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) var globalLogger *zap.Logger var globalSugared *zap.SugaredLogger func init() { InitLogger(os.Getenv("LOG_LEVEL")) } // InitLogger initializes the global Zap logger with proper formatting and log levels. func InitLogger(level string) *zap.Logger { zapLevel := zapcore.InfoLevel switch strings.ToLower(level) { case "debug": zapLevel = zapcore.DebugLevel case "warn", "warning": zapLevel = zapcore.WarnLevel case "error": zapLevel = zapcore.ErrorLevel } encoderConfig := zapcore.EncoderConfig{ TimeKey: "time", LevelKey: "level", NameKey: "logger", CallerKey: "caller", MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.CapitalColorLevelEncoder, EncodeTime: zapcore.TimeEncoderOfLayout("15:04:05.000"), EncodeDuration: zapcore.StringDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, } core := zapcore.NewCore( zapcore.NewConsoleEncoder(encoderConfig), zapcore.AddSync(os.Stdout), zapLevel, ) globalLogger = zap.New(core, zap.AddCaller()) globalSugared = globalLogger.Sugar() return globalLogger } // L returns the global zap logger instance. func L() *zap.Logger { if globalLogger == nil { InitLogger("info") } return globalLogger } // S returns the global sugared logger instance. func S() *zap.SugaredLogger { if globalSugared == nil { InitLogger("info") } return globalSugared } // Named creates a child logger with a component name tag. func Named(name string) *zap.Logger { return L().Named(name) }