logging.go (1162B)
1 package main 2 3 import ( 4 "log/slog" 5 "net/http" 6 "os" 7 "strings" 8 "time" 9 10 "github.com/go-chi/chi/v5/middleware" 11 ) 12 13 func configureLogger() { 14 slog.SetDefault(slog.New(slog.NewTextHandler( 15 os.Stdout, 16 &slog.HandlerOptions{Level: envLogLevel("LOG_LEVEL", slog.LevelInfo)}, 17 ))) 18 } 19 20 func envLogLevel(key string, fallback slog.Level) slog.Level { 21 raw := strings.TrimSpace(strings.ToLower(os.Getenv(key))) 22 if raw == "" { 23 return fallback 24 } 25 26 var lvl slog.Level 27 if err := lvl.UnmarshalText([]byte(raw)); err != nil { 28 return fallback 29 } 30 31 return lvl 32 } 33 34 func requestLoggerMiddleware(logger *slog.Logger) func(http.Handler) http.Handler { 35 if logger == nil { 36 logger = slog.Default() 37 } 38 39 return func(next http.Handler) http.Handler { 40 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 41 start := time.Now() 42 ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor) 43 next.ServeHTTP(ww, r) 44 45 logger.Info("http request", 46 "method", r.Method, 47 "url", r.URL.String(), 48 "proto", r.Proto, 49 "remote_addr", r.RemoteAddr, 50 "status", ww.Status(), 51 "bytes", ww.BytesWritten(), 52 "duration", time.Since(start), 53 ) 54 }) 55 } 56 }