diff options
author | Marc Pervaz Boocha <mboocha@sudomsg.com> | 2025-07-27 15:43:06 +0530 |
---|---|---|
committer | Marc Pervaz Boocha <mboocha@sudomsg.com> | 2025-07-27 15:43:06 +0530 |
commit | 41178f6bad1f2e1eaed462475cb7aa26185dc0ac (patch) | |
tree | 8c025140c6d1d35d02246ea413b135da93021532 /logging/handler/handler.go | |
download | gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar.gz gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar.bz2 gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar.lz gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar.xz gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar.zst gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.zip |
Initial Commit
Diffstat (limited to 'logging/handler/handler.go')
-rw-r--r-- | logging/handler/handler.go | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/logging/handler/handler.go b/logging/handler/handler.go new file mode 100644 index 0000000..1501715 --- /dev/null +++ b/logging/handler/handler.go @@ -0,0 +1,75 @@ +package handler + +import ( + "go-pkg-server/logging" + "log/slog" + "net/http" + "time" +) + +type traceWriter struct { + http.ResponseWriter + status int + bytes int +} + +var _ http.ResponseWriter = &traceWriter{} + +func (t *traceWriter) Write(b []byte) (int, error) { + if t.status == 0 { + t.WriteHeader(http.StatusOK) + } + c, err := t.ResponseWriter.Write(b) + t.bytes += c + return c, err +} + +func (tw *traceWriter) WriteHeader(statusCode int) { + if tw.status == 0 { + tw.status = http.StatusOK + } + tw.status = statusCode + tw.ResponseWriter.WriteHeader(statusCode) +} + +func New(next http.Handler) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + logger := logging.FromContext(ctx) + + defer func() { + err := recover() + if err != nil { + logging.RecoverLog(ctx, err) + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + } + }() + + logger = logger.With("method", r.Method, + "host", r.Host, + "remote_address", r.RemoteAddr, + "path", r.RequestURI, + ) + + ctx = logging.WithLogger(ctx, logger) + + r = r.WithContext(ctx) + + tw := &traceWriter{ResponseWriter: w} + + start := time.Now() + next.ServeHTTP(tw, r) + duration := time.Since(start) + + logger.Log(ctx, slog.LevelInfo, "Request Handled", + "protocol", r.Proto, + "bytes_recieved", r.ContentLength, + "status", tw.status, + "time", duration, + "bytes_sent", tw.bytes, + "user_agent", r.UserAgent(), + "referer", r.Referer(), + ) + + } +} |