48 lines
948 B
Go
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...)
|
|
}
|
|
})
|
|
}
|