В чем разница между Fluentd и Logstash?

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

Ответ

Fluentd и Logstash — это два популярных инструмента для сбора, обработки и пересылки логов (log shippers). Выбор зависит от стека технологий и требований к ресурсам.

Сравнительная таблица:

Критерий Fluentd Logstash
Язык / Ресурсы Написана на Ruby и C (критичные части). Более легковесна, потребляет меньше памяти (~40 МБ). Написана на JRuby (запускается на JVM). Требует больше ресурсов (обычно от 500 МБ до 1 ГБ+ RAM).
Архитектура Использует систему плагинов (input/filter/output), конфигурация на собственном DSL. Использует конвейерную модель (pipeline) с этапами input → filter → output. Конфигурация на основе DSL Ruby.
Экосистема / Стек Часть Cloud Native Computing Foundation (CNCF). Де-факто стандарт для Kubernetes (часто используется через DaemonSet). Интегрируется с множеством выходов. Является ключевым компонентом Elastic Stack (ELK/ELK). Идеально интегрирован с Elasticsearch и Kibana.
Надежность Поддерживает буферизацию на диске для надежной доставки, что критично в production. Также поддерживает устойчивость через очередь (persistent queues).
Производительность Высокая производительность за счет оптимизации на C. Может быть узким местом в высоконагруженных системах из-за накладных расходов JVM.

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

# fluentd-configmap.yaml (упрощенно)
<source>
  @type tail
  path /var/log/containers/*.log
  pos_file /var/log/fluentd-containers.log.pos
  tag kubernetes.*
  read_from_head true
  <parse>
    @type json
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </parse>
</source>

<filter kubernetes.**>
  @type kubernetes_metadata
</filter>

<match **>
  @type elasticsearch
  host elasticsearch-logging
  port 9200
  logstash_format true
  buffer_chunk_limit 2M
  buffer_queue_limit 32
  flush_interval 5s
</match>

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

# logstash.conf
input {
  file {
    path => "/var/log/app/application.log"
    start_position => "beginning"
  }
}

filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:message}" }
  }
  date {
    match => [ "timestamp", "ISO8601" ]
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "app-logs-%{+YYYY.MM.dd}"
  }
}

Рекомендация для DevOps: В Kubernetes-средах Fluentd (или его переписанный на Go аналог Fluent Bit) часто предпочтительнее из-за меньшего потребления ресурсов и нативной интеграции. Для стека Elastic, где Logstash уже используется для сложной обработки, он остается отличным выбором.