Назад | Перейти на главную страницу

Logstash фильтрует системный журнал по группе хостов?

У меня запущен экземпляр Elasticsearch / Logstash / Kibana, который я весело наполняю системными журналами с разных хостов.

Создав его для масштабирования - с несколькими прослушивателями logstash syslogd и несколькими узлами ES - он отлично справляется с сортировкой журналов по большому портфелю серверов.

У меня только одна проблема - группировка хостов. Я могу получить наборы данных для групп хостов на основе различных критериев из моей базы данных конфигурации - физическое местоположение, «услуга», «клиент» и т. Д.

И я действительно хотел бы иметь возможность добавлять их в качестве критериев фильтрации в мою базу данных elasticsearch, и, если это вообще возможно, я мог бы использовать их в Kibana без особых изменений.

В настоящее время я думаю о следующем:

Но мне интересно, занимается ли кто-нибудь уже этим и может предложить разумный подход?

Покопавшись, я наконец решил использовать плагин logstash. 'фильтр-перевод'

Это принимает файл YAML с парами "ключ-значение" и позволяет вам переписывать входящую запись журнала на его основе.

Так:

translate { 
    field => "logsource"
    destination => "host_group"
    dictionary_path => [ "/logstash/host_groups.dict" ]
}

Это довольно простой список:

hostname : group
hostname2 : group

На данный момент он статичен, перестраивается и загружается через cron. Я собираюсь подтолкнуть к etcd и confd сделать более адаптивное решение.

Это означает, что события уже «помечены» при входе в elasticsearch, а также, поскольку мои механизмы logstash распределены и автономны, в любом случае желательно запускать «кэшированный» список. Мои списки хостов меняются недостаточно быстро, поэтому это проблема.

Вы говорите, что используете Logstash syslog входной плагин в качестве цели для локальных демонов системного журнала вашего хоста.

Предполагая, что демон syslog каждого хоста также записывает записи журнала в файлы, вы можете использовать Filebeat чтобы отправить эти файлы в LS, добавив нужные теги в источник. В зависимости от количества хостов эта задача может оказаться нетривиальной.

Другие варианты, от самых простых до самых сложных:

  1. Напишите удар if... elseif ... else ... в вашей конфигурации LS для захвата каждого хоста и добавления соответствующих тегов с mutate фильтр.
    Это работает, но означает изменение вашей конфигурации каждый раз, когда вы добавляете / удаляете хост / службу / клиента. Наличие каждого хоста в собственном файле конфигурации немного упрощает ситуацию, но по-прежнему означает перезапуск LS каждый раз.

  2. Использовать эластичный поиск фильтр, чтобы запросить документ в ES, который имеет нужные вам теги, и добавить их к событиям, которые вы обрабатываете.
    Запрос должен быть достаточно хорошо составлен, но это может сработать. Вам нужно будет создать документы определенного типа, возможно, в уникальном индексе для каждого хоста, чтобы ваши данные всегда были там.

  3. Напишите настраиваемый плагин фильтра, чтобы получать нужные данные из другого источника.
    Несколько раз я думал о написании плагина фильтра Redis для поиска источников журналов, которые нельзя изменить и которые предоставляют только числовые ссылки на определенные объекты, но для которых нам нужны имена для простоты поиска. Я не знаю, насколько это будет сложно, но это должно быть выполнимо.