Логирование: доменная граница ошибок + защита секретов в логах
Приём торрента через Telegram молча падал без записи в логах. Разобрали цепочку и починили логирование/обработку ошибок по конвенции logging.md (логирует граница домена один раз, транспорты — нет). Доменная граница логирует исход: - ingest.Ingest: сбой БД → ERROR, невалидный источник → DEBUG; - команды воркера (Apply/Cancel/Retry/Refine/…) — единый чокпоинт logCmd (ERROR для инфраструктурного сбоя; DEBUG для conflict/not-ready/not-found), закрывает и Telegram-, и HTTP-путь; дублирующие ERROR-логи в tgbot сняты; - внутренний логгер tgbotapi заведён в slog: сбои long-poll getUpdates больше не уходят в stdlib log мимо структурированных логов; - тихое закрытие канала обновлений бота → ERROR. Защита секретов (инвариант «секреты не в логи»): - общий logging.SanitizeErr убирает URL из *url.Error; - закрыты утечки токена бота (getMe на старте, getFile, Send/Request) и api_key TMDB (query-параметр, попадавший в *url.Error на ERROR); - покрыто тестом internal/logging/sanitize_test.go. Ревью двумя сабагентами (fable): инфраструктурные и доменные ошибки. Отложено (не в scope этого коммита): обёртка ErrConflict в Cancel/Defer/Retry и классификация 500→409/400, обновление docs/conventions. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -54,12 +54,15 @@ func (c ExtCall) SuccessDebug(log *slog.Logger, extra ...any) {
|
||||
log.Debug("external call", c.attrs(extra...)...)
|
||||
}
|
||||
|
||||
// Retry логирует неудачную попытку, после которой будет повтор (WARN).
|
||||
// Retry логирует неудачную попытку, после которой будет повтор (WARN). Ошибка
|
||||
// санитизируется (SanitizeErr): транспортный сбой несёт URL с секретом
|
||||
// (api_key TMDB в query, токен в пути) — в лог он попасть не должен.
|
||||
func (c ExtCall) Retry(log *slog.Logger, err error, extra ...any) {
|
||||
log.Warn("external call retry", c.attrs(append([]any{"error", err}, extra...)...)...)
|
||||
log.Warn("external call retry", c.attrs(append([]any{"error", SanitizeErr(err)}, extra...)...)...)
|
||||
}
|
||||
|
||||
// Failure логирует окончательную неудачу вызова / недоступность сервиса (ERROR).
|
||||
// Ошибка санитизируется (SanitizeErr) — см. Retry.
|
||||
func (c ExtCall) Failure(log *slog.Logger, err error, extra ...any) {
|
||||
log.Error("external call failed", c.attrs(append([]any{"error", err}, extra...)...)...)
|
||||
log.Error("external call failed", c.attrs(append([]any{"error", SanitizeErr(err)}, extra...)...)...)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user