package logging import "log/slog" // Logger interface allows users to plug in their own logger type Logger interface { Debug(msg string, args ...any) Info(msg string, args ...any) Warn(msg string, args ...any) Error(msg string, args ...any) } var defaultLogger Logger = &slogLogger{logger: slog.Default()} // SetLogger allows users to plug in their own logger func SetLogger(l Logger) { defaultLogger = l } // Init initializes the default slog logger with a specific log level func Init(level string) { var slogLevel slog.Level switch level { case "debug": slogLevel = slog.LevelDebug case "info": slogLevel = slog.LevelInfo case "warn": slogLevel = slog.LevelWarn case "error": slogLevel = slog.LevelError default: slogLevel = slog.LevelInfo } handler := slog.NewTextHandler(nil, &slog.HandlerOptions{ Level: slogLevel, }) defaultLogger = &slogLogger{logger: slog.New(handler)} } // Default slog implementation type slogLogger struct { logger *slog.Logger } func (s *slogLogger) Debug(msg string, args ...any) { s.logger.Debug(msg, args...) } func (s *slogLogger) Info(msg string, args ...any) { s.logger.Info(msg, args...) } func (s *slogLogger) Warn(msg string, args ...any) { s.logger.Warn(msg, args...) } func (s *slogLogger) Error(msg string, args ...any) { s.logger.Error(msg, args...) } // Package-level functions for convenience func Debug(msg string, args ...any) { defaultLogger.Debug(msg, args...) } func Info(msg string, args ...any) { defaultLogger.Info(msg, args...) } func Warn(msg string, args ...any) { defaultLogger.Warn(msg, args...) } func Error(msg string, args ...any) { defaultLogger.Error(msg, args...) }