Как было организовано логирование на вашем последнем проекте?

«Как было организовано логирование на вашем последнем проекте?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

На последнем проекте мы построили централизованную систему логирования на основе стека EFK (Elasticsearch, Fluentd, Kibana) в Kubernetes.

Архитектура и поток данных:

  1. Приложения: Логировали в stdout/stderr в структурированном JSON-формате.
  2. Fluentd (DaemonSet): Собирал логи с нод Kubernetes, парсил JSON, обогащал метаданными (pod name, namespace, labels) и отправлял в Elasticsearch.
  3. Elasticsearch: Кластер из 3 мастер-нод и 5 данных-нод для хранения и индексации.
  4. Kibana: Для визуализации, поиска и создания дашбордов.

Пример конфигурации Fluentd для парсинга JSON:

<source>
  @type tail
  path /var/log/containers/*.log
  pos_file /var/log/fluentd-containers.log.pos
  tag kubernetes.*
  <parse>
    @type json
    time_key time
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </parse>
</source>

Дополнительные практики, которые мы внедрили:

  • Структурированные логи: Использовали единый формат для всех сервисов.
    {"level":"ERROR","time":"2023-10-05T12:00:00Z","service":"auth-api","trace_id":"abc123","message":"Authentication failed","user_id":"456"}
  • Сбор логов инфраструктуры: Через отдельные конфигурации Fluentd собирали логи системных компонентов (kubelet, Docker, системные сервисы).
  • Алертинг: Настраивали правила в Kibana Alerting для отслеживания частоты ошибок (например, >5 ошибок в минуту) и отправки уведомлений в Slack.
  • Ретеншн и индексы: В Elasticsearch настраивали ILM (Index Lifecycle Management) для автоматического ротирования индексов (удаление логов старше 30 дней).

Для продакшена критически важных сервисов дополнительно подключали Sentry для трекинга ошибок на уровне приложения с полным стектрейсом.