logging.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package server
  2. import (
  3. "log/slog"
  4. "net/http"
  5. "time"
  6. )
  7. func (s *Server) loggingHandler(next http.Handler) http.Handler {
  8. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  9. if s.logger == nil {
  10. next.ServeHTTP(w, r)
  11. return
  12. }
  13. start := time.Now()
  14. lrw := &loggingResponseWriter{ResponseWriter: w, statusCode: http.StatusOK}
  15. s.logger.Debug("HTTP request",
  16. slog.String("method", r.Method),
  17. slog.String("path", r.URL.Path),
  18. slog.String("remote_addr", r.RemoteAddr),
  19. slog.String("user_agent", r.UserAgent()),
  20. )
  21. next.ServeHTTP(lrw, r)
  22. duration := time.Since(start)
  23. s.logger.Debug("HTTP response",
  24. slog.String("method", r.Method),
  25. slog.String("path", r.URL.Path),
  26. slog.Int("status", lrw.statusCode),
  27. slog.Duration("duration", duration),
  28. slog.String("remote_addr", r.RemoteAddr),
  29. slog.String("user_agent", r.UserAgent()),
  30. )
  31. })
  32. }
  33. type loggingResponseWriter struct {
  34. http.ResponseWriter
  35. statusCode int
  36. }
  37. func (lrw *loggingResponseWriter) WriteHeader(code int) {
  38. lrw.statusCode = code
  39. lrw.ResponseWriter.WriteHeader(code)
  40. }
  41. func (lrw *loggingResponseWriter) Unwrap() http.ResponseWriter {
  42. return lrw.ResponseWriter
  43. }