prime8dev

prime8dev
git clone https://git.prime8.dev/prime8dev.git
Log | Files | Refs | README | LICENSE

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 }