Gymterview
senior

Как собирать и анализировать логи в production?

Принцип production-логирования: приложение пишет логи в stdout (JSON), инфраструктура собирает и доставляет их в систему агрегации для поиска, визуализации и алертинга.

Популярные стеки агрегации логов

Стек Компоненты Особенности
ELK Elasticsearch + Logstash + Kibana Мощный полнотекстовый поиск, высокое потребление ресурсов
Grafana Loki Promtail + Loki + Grafana Легковесный, индексирует только метки, дешевле ELK
Cloud-native CloudWatch (AWS) / Cloud Logging (GCP) / Azure Monitor Минимальная настройка, vendor lock-in

Архитектура сбора логов

Пример
ELK:         Приложение -> stdout (JSON) -> Filebeat/Logstash -> Elasticsearch -> Kibana (UI)
Loki:        Приложение -> stdout (JSON) -> Promtail -> Loki -> Grafana (UI)
Cloud:       Приложение -> stdout -> CloudWatch / Cloud Logging / Azure Monitor

Логирование в Kubernetes

В Kubernetes стандартный подход — вывод логов в stdout:

  • Приложение пишет в stdout — kubelet собирает автоматически
  • Доступ через kubectl logs для быстрой диагностики
  • Для агрегации: DaemonSet с Promtail/Fluentd на каждой ноде читает /var/log/containers/*.log и отправляет в систему агрегации

Файловое логирование внутри контейнера — антипаттерн: при рестарте пода файлы теряются.

Correlation ID для distributed tracing

В микросервисной архитектуре один запрос проходит через несколько сервисов. Для связывания логов используется correlation ID:

Пример
// Заголовок X-Request-ID проходит через все микросервисы
// Каждый сервис добавляет его в MDC -> в логи -> в систему агрегации
// В Kibana/Grafana: фильтр по requestId показывает путь запроса через все сервисы

Spring Boot 3.x + Micrometer Tracing автоматизирует этот процесс:

  • Генерирует traceId и spanId
  • Пробрасывает через HTTP-заголовки (W3C Trace Context)
  • Добавляет в MDC, откуда попадает в логи

Retention policy

Определите сроки хранения для разных уровней:

Уровень Рекомендуемый срок хранения
DEBUG/TRACE 3-7 дней (если вообще включены)
INFO 30-90 дней
WARN 90 дней
ERROR 1 год

Частые ошибки

  • Логи в файлы внутри контейнера — при рестарте пода файлы теряются; пишите в stdout
  • Отсутствие retention policy — логи растут бесконечно, Elasticsearch потребляет терабайты
  • Нет алертинга на ERROR — логи собираются, но никто не настроил уведомления
  • Отсутствие correlation ID — невозможно проследить путь запроса через микросервисы

Как используется в 2026

  • Grafana Loki вытесняет ELK для многих проектов (проще, дешевле)
  • OpenTelemetry унифицирует логи, метрики и трейсы в единый стандарт
  • Spring Boot 3.x + Micrometer — автоматическая интеграция с Grafana/Prometheus/Tempo

На собеседовании: ключевые темы — stdout в Kubernetes (не файлы), structured JSON для машинного парсинга, correlation ID для distributed tracing. Частая ошибка — описать только ELK, не упомянув Loki и OpenTelemetry как современные альтернативы.