// Package logging provides centralized structured logging using slog // with configurable log levels. Call InitLogger() from main() to configure. package logging import ( "io" "log/slog" "os" "strings" ) // InitLogger initializes the global slog default logger with the specified log level. // Valid levels: debug, info, warn, error (case-insensitive) // If level is empty or invalid, defaults to INFO. // Call this from main() at startup. func InitLogger(level string) { var logLevel slog.Level switch strings.ToLower(strings.TrimSpace(level)) { case "debug": logLevel = slog.LevelDebug case "info", "": logLevel = slog.LevelInfo case "warn", "warning": logLevel = slog.LevelWarn case "error": logLevel = slog.LevelError default: logLevel = slog.LevelInfo } opts := &slog.HandlerOptions{ Level: logLevel, } handler := slog.NewTextHandler(os.Stdout, opts) slog.SetDefault(slog.New(handler)) } // SetupTestLogger configures logging for tests to reduce noise. // Sets log level to WARN and outputs to io.Discard to suppress DEBUG and INFO messages. // Returns a cleanup function that should be called when the test completes (use t.Cleanup). func SetupTestLogger() func() { // Save original logger to restore later originalLogger := slog.Default() // Set level to WARN and discard output to silence tests opts := &slog.HandlerOptions{ Level: slog.LevelWarn, } handler := slog.NewTextHandler(io.Discard, opts) slog.SetDefault(slog.New(handler)) // Return cleanup function return func() { slog.SetDefault(originalLogger) } }