package httpx import ( "log/slog" "net/http" "os" "strings" "time" "github.com/go-chi/chi/v5/middleware" ) // NewLogger создаёт JSON-логгер с заданным уровнем (debug, info, warn, error). func NewLogger(level string) *slog.Logger { var lvl slog.Level if err := lvl.UnmarshalText([]byte(strings.ToUpper(level))); err != nil { lvl = slog.LevelInfo } return slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: lvl})) } // AccessLog пишет строку лога на каждый запрос, кроме проб здоровья. func AccessLog(log *slog.Logger) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/healthz" || r.URL.Path == "/readyz" { next.ServeHTTP(w, r) return } ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor) start := time.Now() next.ServeHTTP(ww, r) log.InfoContext(r.Context(), "http", "method", r.Method, "path", r.URL.Path, "status", ww.Status(), "bytes", ww.BytesWritten(), "duration_ms", time.Since(start).Milliseconds(), "request_id", middleware.GetReqID(r.Context()), ) }) } }