У меня запущен экземпляр 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, добавив нужные теги в источник. В зависимости от количества хостов эта задача может оказаться нетривиальной.
Другие варианты, от самых простых до самых сложных:
Напишите удар if... elseif ... else ...
в вашей конфигурации LS для захвата каждого хоста и добавления соответствующих тегов с mutate
фильтр.
Это работает, но означает изменение вашей конфигурации каждый раз, когда вы добавляете / удаляете хост / службу / клиента. Наличие каждого хоста в собственном файле конфигурации немного упрощает ситуацию, но по-прежнему означает перезапуск LS каждый раз.
Использовать эластичный поиск фильтр, чтобы запросить документ в ES, который имеет нужные вам теги, и добавить их к событиям, которые вы обрабатываете.
Запрос должен быть достаточно хорошо составлен, но это может сработать. Вам нужно будет создать документы определенного типа, возможно, в уникальном индексе для каждого хоста, чтобы ваши данные всегда были там.
Напишите настраиваемый плагин фильтра, чтобы получать нужные данные из другого источника.
Несколько раз я думал о написании плагина фильтра Redis для поиска источников журналов, которые нельзя изменить и которые предоставляют только числовые ссылки на определенные объекты, но для которых нам нужны имена для простоты поиска. Я не знаю, насколько это будет сложно, но это должно быть выполнимо.