Как была организована централизованная сборка логов с production-серверов?

«Как была организована централизованная сборка логов с production-серверов?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

На последнем проекте использовался стек ELK (Elasticsearch, Logstash, Kibana) для централизованного управления логами.

Архитектура и настройка:

  1. На стороне приложения (Java/Spring Boot): Использовался Logback с logstash-logback-encoder для отправки структурированных логов (JSON) напрямую в Logstash по TCP.
    <!-- Пример фрагмента logback-spring.xml -->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>${LOGSTASH_HOST}:5000</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"app":"my-service", "env":"prod"}</customFields>
        </encoder>
    </appender>
  2. Logstash: Принимал логи, применял фильтры (парсинг, обогащение метаданными) и отправлял в Elasticsearch.
  3. Elasticsearch: Хранил индексированные логи для быстрого поиска.
  4. Kibana: Предоставляла веб-интерфейс для визуализации, поиска и создания дашбордов.

Дополнительные меры:

  • Настройка ротации и retention-политики логов на самих серверах (via logrotate или TimeBasedRollingPolicy) для предотвращения переполнения диска.
  • Отправка в лог только нефункциональных данных (исключая PII), структурированных по уровням (ERROR, WARN, INFO).