- internal/logging: LOG_LEVEL/LOG_FORMAT parsing and slog handler - request_id middleware (X-Request-ID or generated, echoed) + debug access log - httpx registers errors; middleware logs internal causes with request_id - health excluded, objects/sse debug-only, no query/body/secrets in logs - new observability capability spec; README/.env.example docs
3.6 KiB
3.6 KiB
Tasks
1. Конфигурация логирования (A)
- 1.1 Добавить пакет
backend/internal/loggingс разбором уровня (ParseLevel) и сборкой handler (NewHandler(format, level)); проверка —go test ./internal/loggingпокрывает разборdebug|info|warn|error,json|textи ошибки. - 1.2 Добавить секцию
Logвconfig.Configи чтениеLOG_LEVEL/LOG_FORMATс валидацией; проверка —go test ./internal/configпокрывает значения по умолчанию и отказ на недопустимом значении. - 1.3 Строить
slog-handler вcmd/server/main.goизcfg.Logвместо жёсткогоLevelInfo; проверка — запуск сLOG_LEVEL=debug/LOG_FORMAT=textменяет вывод, а недопустимыйLOG_LEVELзавершает старт явной ошибкой. - 1.4 Описать
LOG_LEVEL/LOG_FORMATв.env.exampleиREADME.md; проверка — задокументированный запуск сLOG_LEVEL=debugвыводит подробные строки.
2. Идентификатор запроса и access-лог (B)
- 2.1 Middleware в
app.Router():request_idиз валидногоX-Request-IDлибо сгенерированный, запись в контекст запроса и заголовок ответаX-Request-ID; проверка — тест: переданный id сохраняется и возвращается, отсутствующий генерируется. - 2.2 Access-строка уровня
debug(method, routec.FullPath(), status, latency, bytes, client_ip, user_id, request_id) без query; проверка — тест: наdebugстрока пишется, наinfoнет, query-параметры не попадают. - 2.3 Фильтрация access-логов:
/api/healthисключён всегда,/api/objects/*и/api/sse/*— толькоdebug; проверка — тест на наборе маршрутов и уровне.
3. Регистрация внутренних ошибок (D)
- 3.1 В
httpx.RespondError/Abortрегистрировать не-AppErrorчерезc.Error(err); проверка — тест: неизвестная ошибка попадает вc.Errors, ответ остаётся обобщённым500. - 3.2 Логировать собранные ошибки в middleware: не-
AppErrorиAppErrorсо статусом>=500— уровеньerrorс причиной и request_id,AppError <500— уровеньdebug; проверка — тест с буфером лога на обе ветки. - 3.3 Гарантировать приватность: не логировать query-строку,
Authorizationи тела запросов; проверка — тест с?token=...и телом убеждается, что значения не встречаются в буфере лога.
4. Интеграционная проверка
- 4.1 Прогнать локальный инстанс с
LOG_LEVEL=debug, выполнить несколько запросов (включая аутентифицированный и/api/health) и убедиться: access-строки есть,X-Request-IDвозвращается в ответе,/api/healthне логируется, секреты в логах отсутствуют.