70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
package logging
|
|
|
|
import (
|
|
"acc-server-manager/local/utl/logging"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
// RequestLoggingMiddleware logs HTTP requests and responses
|
|
type RequestLoggingMiddleware struct {
|
|
infoLogger *logging.InfoLogger
|
|
}
|
|
|
|
// NewRequestLoggingMiddleware creates a new request logging middleware
|
|
func NewRequestLoggingMiddleware() *RequestLoggingMiddleware {
|
|
return &RequestLoggingMiddleware{
|
|
infoLogger: logging.GetInfoLogger(),
|
|
}
|
|
}
|
|
|
|
// Handler returns the middleware handler function
|
|
func (rlm *RequestLoggingMiddleware) Handler() fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
// Record start time
|
|
start := time.Now()
|
|
|
|
// Log incoming request
|
|
userAgent := c.Get("User-Agent")
|
|
if userAgent == "" {
|
|
userAgent = "Unknown"
|
|
}
|
|
|
|
rlm.infoLogger.LogRequest(c.Method(), c.OriginalURL(), userAgent)
|
|
|
|
// Continue to next handler
|
|
err := c.Next()
|
|
|
|
// Calculate duration
|
|
duration := time.Since(start)
|
|
|
|
// Log response
|
|
statusCode := c.Response().StatusCode()
|
|
rlm.infoLogger.LogResponse(c.Method(), c.OriginalURL(), statusCode, duration.String())
|
|
|
|
// Log error if present
|
|
if err != nil {
|
|
logging.ErrorWithContext("REQUEST_MIDDLEWARE", "Request failed: %v", err)
|
|
}
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// Global request logging middleware instance
|
|
var globalRequestLoggingMiddleware *RequestLoggingMiddleware
|
|
|
|
// GetRequestLoggingMiddleware returns the global request logging middleware
|
|
func GetRequestLoggingMiddleware() *RequestLoggingMiddleware {
|
|
if globalRequestLoggingMiddleware == nil {
|
|
globalRequestLoggingMiddleware = NewRequestLoggingMiddleware()
|
|
}
|
|
return globalRequestLoggingMiddleware
|
|
}
|
|
|
|
// Handler returns the global request logging middleware handler
|
|
func Handler() fiber.Handler {
|
|
return GetRequestLoggingMiddleware().Handler()
|
|
}
|