Files
2026-08-19 22:05:49 +08:00

48 lines
948 B
Go

package middleware
import (
"log/slog"
"net/http"
"time"
)
type LoggerMiddleware struct {
}
func NewLoggerMiddleware() *LoggerMiddleware {
return &LoggerMiddleware{}
}
func (m *LoggerMiddleware) Middleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
reqCtx := GetRequestContext(r.Context())
rw := NewResponseRecorder(w)
next.ServeHTTP(rw, r)
fields := []any{
"request_id", reqCtx.RequestID,
"method", reqCtx.Method,
"path", reqCtx.Path,
"status", rw.statusCode,
"start_time", reqCtx.StartTime,
"duration", time.Since(reqCtx.StartTime),
"client_ip", reqCtx.ClientIp,
}
if rw.errorMsg != "" {
fields = append(fields, "error", rw.errorMsg)
}
switch {
case rw.statusCode >= 500:
slog.Error("request", fields...)
case rw.statusCode >= 400:
slog.Warn("request", fields...)
default:
slog.Info("request", fields...)
}
})
}