From 4a83ab6bd6d35c6a5587fb76f311b5fa5329fa2b Mon Sep 17 00:00:00 2001 From: Florian Walther Date: Sun, 8 Feb 2026 22:42:31 +0100 Subject: [PATCH] logging middleware added --- main.go | 73 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 17 deletions(-) diff --git a/main.go b/main.go index 68b7142..2b96b45 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "os" "net" + "time" "strconv" "strings" "sync" @@ -26,6 +27,47 @@ var ( mu sync.Mutex ) +type responseWriter struct { + http.ResponseWriter + statusCode int +} + +func (rw *responseWriter) WriteHeader(code int) { + rw.statusCode = code + rw.ResponseWriter.WriteHeader(code) +} + +func newResponseWriter(w http.ResponseWriter) *responseWriter { + return &responseWriter{w, http.StatusOK} // Default 200 OK +} + +func LoggingMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + start := time.Now() + + // ResponseWriter einpacken + rw := newResponseWriter(w) + + // Den nächsten Handler ausführen + next.ServeHTTP(rw, r) + + // Log-Daten sammeln + duration := time.Since(start) + clientIP := getClientIP(r) // Deine Funktion von vorhin + + // Format: IP - - [Datum] "Method Path Proto" Status Duration + log.Printf("%s - - [%s] \"%s %s %s\" %d %v\n", + clientIP, + time.Now().Format("02/Jan/2006:15:04:05 -0700"), + r.Method, + r.URL.Path, + r.Proto, + rw.statusCode, + duration, + ) + }) +} + func getClientIP(r *http.Request) string { // 1. Prüfe den X-Forwarded-For Header (Standard für Proxies) xForwardedFor := r.Header.Get("X-Forwarded-For") @@ -114,8 +156,6 @@ func generatePassword() string { } func passwordHandler(w http.ResponseWriter, r *http.Request) { - clientIP := getClientIP(r) - log.Printf("passwordHandler aufrerufen von IP: %s\n", clientIP) if debug { log.Printf("called passwordHandler\n") } password := generatePassword() currentCount := GetPasswordCount() @@ -133,8 +173,6 @@ func passwordHandler(w http.ResponseWriter, r *http.Request) { } func passwordAPIHandler(w http.ResponseWriter, r *http.Request) { - clientIP := getClientIP(r) - log.Printf("passwordAPIHandler aufrerufen von IP: %s\n", clientIP) if debug { log.Printf("called passwordHandler\n") } password := generatePassword() w.Header().Set("Content-Type", "text/plain") @@ -142,8 +180,6 @@ func passwordAPIHandler(w http.ResponseWriter, r *http.Request) { } func indexHandler(w http.ResponseWriter, r *http.Request) { - clientIP := getClientIP(r) - log.Printf("indexHandler aufrerufen von IP: %s\n", clientIP) if debug { log.Printf("call indexHandler: Request %s %s\n", r.Method, r.URL) } password := generatePassword() //password := "load..." @@ -161,8 +197,6 @@ func indexHandler(w http.ResponseWriter, r *http.Request) { } func helpHandler(w http.ResponseWriter, r *http.Request) { - clientIP := getClientIP(r) - log.Printf("helpHandler aufrerufen von IP: %s\n", clientIP) if debug { log.Printf("call helpHandler\n") } err := templates["help.html"].ExecuteTemplate(w, "base.html", nil) if err != nil { @@ -172,15 +206,20 @@ func helpHandler(w http.ResponseWriter, r *http.Request) { } func main() { - loadTemplates() - fs := http.FileServer(http.Dir("static")) - http.Handle("/static/", http.StripPrefix("/static/", fs)) + loadTemplates() + mux := http.NewServeMux() + + fs := http.FileServer(http.Dir("static")) + mux.Handle("/static/", http.StripPrefix("/static/", fs)) - http.HandleFunc("/", indexHandler) - http.HandleFunc("/api/password", passwordAPIHandler) - http.HandleFunc("/json/password", passwordHandler) - http.HandleFunc("/help", helpHandler) + mux.HandleFunc("/", indexHandler) + mux.HandleFunc("/api/password", passwordAPIHandler) + mux.HandleFunc("/json/password", passwordHandler) + mux.HandleFunc("/help", helpHandler) - log.Println("Server läuft auf http://localhost:8080") - log.Fatal(http.ListenAndServe(":8080", nil)) + loggingRouter := LoggingMiddleware(mux) + + log.Println("Server läuft auf http://localhost:8080") + + log.Fatal(http.ListenAndServe(":8080", loggingRouter)) }