A container registry that uses the AT Protocol for manifest storage and S3 for blob storage.
atcr.io
docker
container
atproto
go
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}