feat: create logger middleware

This commit is contained in:
Максим Слипенко 2024-12-16 19:34:51 +03:00
parent dc4f17952e
commit dd6d1c9b32
5 changed files with 59 additions and 10 deletions

View file

@ -121,6 +121,8 @@ func (app *App) Run() {
},
)
app.repo.ForceUpdate()
err := http.ListenAndServe(fmt.Sprintf(":%d", app.config.Port), app.router.Setup())
if err != nil {
panic(err)

View file

@ -24,7 +24,7 @@ func (rd *TaskUploadResponse) Render(w http.ResponseWriter, r *http.Request) err
//
// @Summary Upload files to a task
// @Description Upload multiple files associated with a specific task ID. Each file must be less than 10MB.
// @Tags tasks
// @Tags Tasks
// @Accept multipart/form-data
// @Produce json
// @Param taskID path string true "Task ID"

View file

@ -11,11 +11,11 @@ var (
// Logger определяет интерфейс для логгера
type Logger interface {
Debug(msg string, fields map[string]interface{})
Info(msg string, fields map[string]interface{})
Warn(msg string, fields map[string]interface{})
Error(msg string, fields map[string]interface{})
Fatal(msg string, fields map[string]interface{})
Debug(msg string, fields ...map[string]interface{})
Info(msg string, fields ...map[string]interface{})
Warn(msg string, fields ...map[string]interface{})
Error(msg string, fields ...map[string]interface{})
Fatal(msg string, fields ...map[string]interface{})
}
func GetLogger() *ZapLogger {

View file

@ -0,0 +1,46 @@
package middlewares
import (
"net/http"
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/logger"
)
// CustomResponseWriter wraps http.ResponseWriter to capture status code and response size
type CustomResponseWriter struct {
http.ResponseWriter
StatusCode int
BytesWritten int
}
// WriteHeader captures the status code and writes it to the response
func (w *CustomResponseWriter) WriteHeader(statusCode int) {
w.StatusCode = statusCode
w.ResponseWriter.WriteHeader(statusCode)
}
// Write captures the size of the response body
func (w *CustomResponseWriter) Write(data []byte) (int, error) {
bytesWritten, err := w.ResponseWriter.Write(data)
w.BytesWritten += bytesWritten
return bytesWritten, err
}
func LoggerMiddleware(logger logger.Logger) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
customWriter := &CustomResponseWriter{
ResponseWriter: w,
StatusCode: http.StatusOK, // Default status if WriteHeader is not called
}
next.ServeHTTP(customWriter, r)
logger.Info("request", map[string]interface{}{
"path": r.URL.Path,
"method": r.Method,
"ip": r.RemoteAddr,
"status_code": customWriter.StatusCode,
"response_size": customWriter.BytesWritten,
})
})
}
}

View file

@ -2,12 +2,12 @@ package router
import (
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
httpSwagger "github.com/swaggo/http-swagger"
_ "code.alt-gnome.ru/aides-infra/aides-repo-api/docs"
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/config"
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/controllers/taskcontroller"
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/logger"
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/middlewares"
)
@ -27,10 +27,11 @@ func New(
}
func (r *Router) Setup() *chi.Mux {
router := chi.NewRouter()
router.Use(middleware.Logger)
authGuard := middlewares.CreateAuthGuard(r.config)
logger := middlewares.LoggerMiddleware(logger.GetLogger())
router := chi.NewRouter()
router.Use(logger)
router.Get("/swagger/*", httpSwagger.WrapHandler)