A container registry that uses the AT Protocol for manifest storage and S3 for blob storage. atcr.io
docker container atproto go
at refactor 58 lines 1.6 kB view raw
1// Package logging provides centralized structured logging using slog 2// with configurable log levels. Call InitLogger() from main() to configure. 3package logging 4 5import ( 6 "io" 7 "log/slog" 8 "os" 9 "strings" 10) 11 12// InitLogger initializes the global slog default logger with the specified log level. 13// Valid levels: debug, info, warn, error (case-insensitive) 14// If level is empty or invalid, defaults to INFO. 15// Call this from main() at startup. 16func InitLogger(level string) { 17 var logLevel slog.Level 18 19 switch strings.ToLower(strings.TrimSpace(level)) { 20 case "debug": 21 logLevel = slog.LevelDebug 22 case "info", "": 23 logLevel = slog.LevelInfo 24 case "warn", "warning": 25 logLevel = slog.LevelWarn 26 case "error": 27 logLevel = slog.LevelError 28 default: 29 logLevel = slog.LevelInfo 30 } 31 32 opts := &slog.HandlerOptions{ 33 Level: logLevel, 34 } 35 36 handler := slog.NewTextHandler(os.Stdout, opts) 37 slog.SetDefault(slog.New(handler)) 38} 39 40// SetupTestLogger configures logging for tests to reduce noise. 41// Sets log level to WARN and outputs to io.Discard to suppress DEBUG and INFO messages. 42// Returns a cleanup function that should be called when the test completes (use t.Cleanup). 43func SetupTestLogger() func() { 44 // Save original logger to restore later 45 originalLogger := slog.Default() 46 47 // Set level to WARN and discard output to silence tests 48 opts := &slog.HandlerOptions{ 49 Level: slog.LevelWarn, 50 } 51 handler := slog.NewTextHandler(io.Discard, opts) 52 slog.SetDefault(slog.New(handler)) 53 54 // Return cleanup function 55 return func() { 56 slog.SetDefault(originalLogger) 57 } 58}