summaryrefslogtreecommitdiffstats
path: root/logging/handler
diff options
context:
space:
mode:
authorMarc Pervaz Boocha <mboocha@sudomsg.com>2025-07-27 15:43:06 +0530
committerMarc Pervaz Boocha <mboocha@sudomsg.com>2025-07-27 15:43:06 +0530
commit41178f6bad1f2e1eaed462475cb7aa26185dc0ac (patch)
tree8c025140c6d1d35d02246ea413b135da93021532 /logging/handler
downloadgopkgserver-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')
-rw-r--r--logging/handler/handler.go75
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(),
+ )
+
+ }
+}