package main import ( "log" "net/http" "time" ) // Wir bauen unseren eigenen ResponseWriter, der den Status-Code "mitschreibt" type StatusRecorder struct { http.ResponseWriter Status int } // Überschreiben der WriteHeader Methode, um den Code abzufangen func (r *StatusRecorder) WriteHeader(status int) { r.Status = status r.ResponseWriter.WriteHeader(status) } // Die eigentliche Middleware Funktion func Logger(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // 1. Startzeit messen start := time.Now() // 2. Recorder initialisieren (Standard ist 200 OK) recorder := &StatusRecorder{ ResponseWriter: w, Status: http.StatusOK, } // 3. Den echten Handler aufrufen (mit unserem Recorder) next(recorder, r) // 4. Dauer berechnen duration := time.Since(start) // 5. Loggen // Format: [METHODE] PFAD | STATUS | DAUER | IP // Beispiel: [POST] /api/validate | 200 | 1.2ms | 127.0.0.1 icon := "✅" if recorder.Status >= 400 { icon = "⚠️" } if recorder.Status >= 500 { icon = "🔥" } log.Printf("%s [%s] %s | %d | %v | %s", icon, r.Method, r.URL.Path, recorder.Status, duration, r.RemoteAddr, ) } }