Ответ
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 уже используется для сложной обработки, он остается отличным выбором.