Files
2025-10-25 09:54:26 -05:00

59 lines
1.5 KiB
Go

// 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)
}
}