Логирование: ревью всего кода и рефакторинг в соответствии с конвенциями
This commit is contained in:
@@ -135,7 +135,7 @@ type downloadView struct {
|
||||
func (s *server) handleIndex(w http.ResponseWriter, r *http.Request) {
|
||||
downloads, err := s.deps.Reader.ListDownloads(r.Context())
|
||||
if err != nil {
|
||||
s.deps.Logger.Error("list downloads", "err", err)
|
||||
s.deps.Logger.Error("list downloads", "error", err)
|
||||
http.Error(w, "internal error", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
@@ -145,7 +145,7 @@ func (s *server) handleIndex(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
if err := s.index.Execute(w, view); err != nil {
|
||||
s.deps.Logger.Error("render index", "err", err)
|
||||
s.deps.Logger.Error("render index", "error", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -269,7 +269,9 @@ func (s *server) apiCommand(w http.ResponseWriter, r *http.Request, cmd func(con
|
||||
return
|
||||
}
|
||||
if err := cmd(r.Context(), id); err != nil {
|
||||
s.deps.Logger.Warn("api command failed", "path", r.URL.Path, "id", id, "err", err)
|
||||
// Тонкий транспорт: возвращённую use-case'ом/воркером ошибку переводим в
|
||||
// HTTP-статус и не логируем повторно (доменный слой уже залогировал, а
|
||||
// невалидный ввод — это норма, разбирать команде нечего).
|
||||
writeJSON(w, http.StatusConflict, errJSON(err))
|
||||
return
|
||||
}
|
||||
@@ -352,10 +354,17 @@ func requestLogger(logger *slog.Logger) func(http.Handler) http.Handler {
|
||||
|
||||
next.ServeHTTP(ww, r)
|
||||
|
||||
// http.route — низкокардинальный шаблон маршрута (chi), а не
|
||||
// конкретный путь; при отсутствии шаблона падаем на путь.
|
||||
route := chi.RouteContext(r.Context()).RoutePattern()
|
||||
if route == "" {
|
||||
route = r.URL.Path
|
||||
}
|
||||
logger.Log(r.Context(), requestLogLevel(r), "http request",
|
||||
"method", r.Method,
|
||||
"path", r.URL.Path,
|
||||
"status", ww.Status(),
|
||||
"transport", "http",
|
||||
"http.method", r.Method,
|
||||
"http.route", route,
|
||||
"http.status_code", ww.Status(),
|
||||
"bytes", ww.BytesWritten(),
|
||||
"duration_ms", time.Since(start).Milliseconds(),
|
||||
"request_id", middleware.GetReqID(r.Context()),
|
||||
|
||||
@@ -82,7 +82,7 @@ func (s *server) handleReview(w http.ResponseWriter, r *http.Request) {
|
||||
http.Error(w, "задача не найдена", http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
s.deps.Logger.Error("review data", "id", id, "err", err)
|
||||
s.deps.Logger.Error("review data", "id", id, "error", err)
|
||||
http.Error(w, "internal error", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
@@ -140,7 +140,7 @@ func (s *server) handleReview(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
if err := s.review.Execute(w, view); err != nil {
|
||||
s.deps.Logger.Error("render review", "err", err)
|
||||
s.deps.Logger.Error("render review", "error", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,7 +153,8 @@ func (s *server) handleApply(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
if err := s.deps.Reviewer.Apply(r.Context(), id); err != nil {
|
||||
s.deps.Logger.Warn("review action failed", "action", "apply", "id", id, "err", err)
|
||||
// Тонкий транспорт: ошибку воркера переводим в ответ, не логируя
|
||||
// повторно (доменный слой уже залогировал реальный сбой).
|
||||
redirectReview(w, r, id, err.Error())
|
||||
return
|
||||
}
|
||||
@@ -220,7 +221,6 @@ func (s *server) handleDefer(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
if err := s.deps.Reviewer.Defer(r.Context(), id); err != nil {
|
||||
s.deps.Logger.Warn("review action failed", "action", "defer", "id", id, "err", err)
|
||||
redirectReview(w, r, id, err.Error())
|
||||
return
|
||||
}
|
||||
@@ -234,7 +234,6 @@ func (s *server) handleUndo(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
if err := s.deps.Reviewer.Undo(r.Context(), id); err != nil {
|
||||
s.deps.Logger.Warn("review action failed", "action", "undo", "id", id, "err", err)
|
||||
redirectErr(w, r, err.Error())
|
||||
return
|
||||
}
|
||||
@@ -250,7 +249,6 @@ func (s *server) handleRelink(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
if err := s.deps.Reviewer.Relink(r.Context(), id); err != nil {
|
||||
s.deps.Logger.Warn("review action failed", "action", "relink", "id", id, "err", err)
|
||||
redirectErr(w, r, err.Error())
|
||||
return
|
||||
}
|
||||
@@ -266,8 +264,8 @@ func (s *server) reviewAction(w http.ResponseWriter, r *http.Request, fn func(co
|
||||
return
|
||||
}
|
||||
if err := fn(r.Context(), id); err != nil {
|
||||
s.deps.Logger.Warn("review action failed",
|
||||
"action", r.URL.Path, "id", id, "err", err)
|
||||
// Тонкий транспорт: ошибку переводим в ?err= на странице ревью, не
|
||||
// логируя повторно (доменный слой/валидация — не дело транспорта).
|
||||
redirectReview(w, r, id, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user