Эта инструкция показывает, как настроить Logstash в роли приёмника логов (например, от Filebeat) и отправлять их в ваш кластер OpenSearch.
Подходит для стенда из нашей переписки: одноузловой OpenSearch 3.x + Dashboards на Rocky Linux 8.
Все команды выполняются от `root` (или добавляйте `sudo`). Для простоты используем самоподписанные сертификаты на тесте и суточные индексы `logstash-YYYY.MM.DD`.
—
На узле с Logstash откройте порт 5044/tcp (вход от Beats, например Filebeat):
firewall-cmd --add-port=5044/tcp --permanent firewall-cmd --reload
Создайте роль с правами записи только в индексы logstash-*
, пользователя и привязку роли:
# Роль curl -k -u admin:'<ADMIN_PASSWORD>' -X PUT \ "https://<IP_OpenSearch>:9200/_plugins/_security/api/roles/logstash_writer" \ -H 'Content-Type: application/json' -d '{ "index_permissions": [ { "index_patterns": ["logstash-*"], "allowed_actions": ["crud","create_index"] } ] }' # Пользователь curl -k -u admin:'<ADMIN_PASSWORD>' -X PUT \ "https://<IP_OpenSearch>:9200/_plugins/_security/api/user/logstash_ingest" \ -H 'Content-Type: application/json' -d '{ "password": "<STRONG_PASSWORD>", "attributes": {} }' # Привязка роли к пользователю curl -k -u admin:'<ADMIN_PASSWORD>' -X PUT \ "https://<IP_OpenSearch>:9200/_plugins/_security/api/rolesmapping/logstash_writer" \ -H 'Content-Type: application/json' -d '{ "users": ["logstash_ingest"] }'
На тесте можно использовать `admin`, но для прод-среды всегда создавайте отдельного пользователя с минимальными правами.
—
Добавьте репозиторий Elastic и установите пакет logstash
:
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch cat >/etc/yum.repos.d/elastic-8.x.repo <<'REPO' [elastic-8.x] name=Elastic 8.x baseurl=https://artifacts.elastic.co/packages/8.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md REPO dnf clean all dnf -y install logstash
Рекомендуется установить официальный плагин вывода logstash-output-opensearch:
/usr/share/logstash/bin/logstash-plugin install logstash-output-opensearch
Можно использовать и стандартный `elasticsearch`-output, но с OpenSearch бывают нюансы совместимости. Плагин `opensearch` избавляет от них.
—
По умолчанию сервис Logstash читает конфиги из /etc/logstash/conf.d/*.conf
(через path.config
). Создадим три файла: input, фильтры (опционально) и output.
input { beats { port => 5044 # При необходимости TLS на входе (для прод-среды): # ssl => true # ssl_certificate => "/etc/logstash/certs/logstash.crt" # ssl_key => "/etc/logstash/certs/logstash.key" } }
Добавьте полезные теги/поля, распарсьте строки, нормализуйте уровни и т. п.
filter { if [fileset][module] == "system" and [fileset][name] == "auth" { mutate { add_tag => ["auth"] } } if [message] =~ /timeout|timed out|connection reset/i { mutate { add_tag => ["timeout"] } } # Пример grok для Nginx (если шлёте логи nginx через file input): # grok { # match => { "message" => "%{NGINXACCESS}" } # } }
Вариант для самоподписанного TLS на OpenSearch (тестовый стенд):
output { opensearch { hosts => ["https://<IP_OpenSearch>:9200"] user => "logstash_ingest" password => "<STRONG_PASSWORD>" index => "logstash-%{+YYYY.MM.dd}" ssl => true ssl_certificate_verification => false # Не ставим шаблоны от Logstash в OpenSearch manage_template => false # Дополнительно http_compression => true } # Для отладки — вывод в stdout в формате JSON (временно) # stdout { codec => rubydebug } }
В прод-среде **включайте проверку TLS** и указывайте свой CA:```confssl_certificate_verification => truecacert => "/etc/pki/ca-trust/source/anchors/opensearch-ca.crt"```
Сохраните файлы и проверьте конфигурацию:
/usr/share/logstash/bin/logstash --path.settings /etc/logstash -t
Если Config Validation Result: OK
, включайте автозапуск и стартуйте:
systemctl enable --now logstash systemctl status logstash --no-pager journalctl -u logstash -n 200 --no-pager
Если раньше Filebeat слал напрямую в OpenSearch, переключите его на Logstash. В /etc/filebeat/filebeat.yml
замените output.elasticsearch
на output.logstash
:
# output.elasticsearch: # отключить/закомментировать output.logstash: hosts: ["<LOGSTASH_IP>:5044"] # Для TLS на входе Logstash включите: # ssl.certificate_authorities: ["/etc/pki/tls/certs/logstash-ca.crt"] # ssl.verification_mode: full
Проверка и запуск:
filebeat test config -e filebeat test output -e systemctl restart filebeat journalctl -u filebeat -n 100 --no-pager
Сгенерируйте тестовую запись и проверьте индекс:
logger -t fbtest "hello from filebeat via logstash" curl -k -u admin:'<ADMIN_PASSWORD>' \ "https://<IP_OpenSearch>:9200/logstash-*/_search?q=fbtest&pretty"
logstash-*
.@timestamp
.
Симптом: в логе certificate verify failed
или таймаут.
- На тесте временно используйте ssl_certificate_verification => false
.
- В прод-среде укажите cacert => "/путь/до/вашего/CA.crt"
и оставьте проверку включённой.
- Проверьте, что порт 9200 доступен из сети Logstash.
Симптом: ошибки рукопожатия TLS или connect: connection refused
.
- Проверьте, что Logstash слушает 0.0.0.0:5044 (и открыт порт в firewalld).
- Если включили TLS на входе beats — укажите CA на стороне Filebeat (ssl.certificate_authorities
).
- Для стенда обнулите реплики по умолчанию для шаблона logstash-*
:
```bash curl -k -u admin:'<ADMIN_PASSWORD>' -X PUT https://<IP_OpenSearch>:9200/_index_template/logstash \ -H 'Content-Type: application/json' -d '{ "index_patterns": ["logstash-*"], "template": { "settings": { "index.number_of_replicas": 0 } } }' ```
- Включите сжатие HTTP (http_compression => true
), настроьте JVM heap Logstash в /etc/logstash/jvm.options.d/heap.options
(например, -Xms1g
/-Xmx1g
).
- Разделяйте пайплайны (через /etc/logstash/pipelines.yml
), если конфигурации становятся большими.
- Не злоупотребляйте тяжелыми grok'ами; по возможности используйте модульные парсеры на стороне Beats.
cacert
и проверкой цепочки.logstash-*
.loadbalance: true
.
Готово. Теперь Logstash принимает логи (например, от Filebeat по 5044) и пишет их в OpenSearch в индексы logstash-*
. Если что-то не взлетело — присылайте хвосты journalctl -u logstash
и мы быстро разберём.