From 417ce259cacea581ab84336f46d881558dd4b4fc Mon Sep 17 00:00:00 2001 From: Michael Hunteman Date: Sat, 25 Jan 2025 13:40:09 -0600 Subject: Containerize golang server with logging --- server/middleware/logging.go | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 server/middleware/logging.go (limited to 'server/middleware/logging.go') diff --git a/server/middleware/logging.go b/server/middleware/logging.go new file mode 100644 index 0000000..860a467 --- /dev/null +++ b/server/middleware/logging.go @@ -0,0 +1,50 @@ +package middleware + +import ( + "bytes" + "log" + "net/http" + "time" +) + +type LoggingResponseWriter struct { + http.ResponseWriter + statusCode int + responseBody *bytes.Buffer +} + +func (w *LoggingResponseWriter) WriteHeader(code int) { + w.statusCode = code + w.ResponseWriter.WriteHeader(code) +} + +func (w *LoggingResponseWriter) Write(data []byte) (int, error) { + w.responseBody.Write(data) + return w.ResponseWriter.Write(data) +} + +func LoggingMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + start := time.Now() + + loggingWriter := &LoggingResponseWriter{ + ResponseWriter: w, + statusCode: http.StatusOK, + responseBody: &bytes.Buffer{}, + } + + next.ServeHTTP(loggingWriter, r) + + log.Printf( + "Client IP: %s | Method: %s | Path: %s | Status: %d | Duration: %v", + r.RemoteAddr, + r.Method, + r.URL.Path, + loggingWriter.statusCode, + time.Since(start), + ) + if loggingWriter.responseBody.Len() > 0 { + log.Print(loggingWriter.responseBody.String()) + } + }) +} -- cgit v1.2.3