Я ' У меня запущен экземпляр Elasticsearch / Logstash / Kibana, который я весело наполняю системными журналами с разных хостов.
Создав его для масштабирования - с несколькими прослушивателями logstash syslogd и несколькими узлами ES - он отлично справляется с сопоставлением журналов по большому портфелю серверов.
У меня есть только одна проблема - группировка хосты. Я могу получить наборы данных для групп хостов на основе различных критериев из моей базы данных конфигурации - физическое местоположение, «услуга», «клиент» и т. Д.
И я действительно хотел бы иметь возможность добавлять их в качестве критериев фильтрации в свой база данных elasticsearch, и, если это вообще возможно, я могу использовать их в Kibana без особых изменений.
В настоящее время я думаю о следующем:
Но мне интересно, занимается ли кто-нибудь уже этим и может предложить разумный подход?
Немного покопавшись, я наконец решил использовать плагин logstash 'filter-translate'
Для этого нужен файл YAML с ключами и значениями, и позволяет вам переписывать входящую запись журнала на ее основе.
Итак:
translate {
field => "logsource"
destination => "host_group"
dictionary_path => [ "/logstash/host_groups.dict" ]
}
Это довольно простой список:
hostname : group
hostname2 : group
В настоящий момент он статичен, перестраивается и загружается через cron
. Я намерен продвинуться к etcd
и confd
, чтобы сделать более адаптивное решение.
Это означает, что события уже «помечены» при входе в elasticsearch, а также, поскольку мои механизмы logstash распределены и автономны, запуск «кэшированного» списка в любом случае желателен. Мои списки хостов меняются недостаточно быстро, поэтому это проблема.
Вы говорите, что используете плагин ввода Logstash syslog
в качестве цели для локальных демонов системного журнала вашего хоста.
Предполагая, что демон системного журнала каждого хоста также записывает записи журнала в файлы, вы можете использовать Filebeat , чтобы отправить эти файлы в LS, добавив нужные теги в источник. В зависимости от количества хостов, которое у вас есть, эта задача может быть нетривиальной.
Другие варианты - от самых простых до самых сложных:
Напишите удар if ... elseif ... else .. .
в конфигурации LS для захвата каждого хоста и добавления соответствующих тегов с фильтром mutate
.
Это работает, но означает изменение вашей конфигурации каждый раз, когда вы добавляете / удаляете хост / службу / клиента. Наличие каждого хоста в собственном файле конфигурации немного упрощает ситуацию, но по-прежнему означает перезапуск LS каждый раз.
Используйте фильтр elasticsearch , чтобы запросить документ в ES, который имеет нужные вам теги, и добавьте их к событиям, которые вы обрабатываете.
Запрос должен быть хорошо составлен, но это может сработать. Вам нужно будет создать документы определенного типа, возможно, в уникальном индексе, для каждого хоста, чтобы ваши данные всегда были там.
Напишите настраиваемый плагин фильтра, чтобы извлекать нужные вам данные из какого-либо другого источника.
Несколько раз я думал о написании плагина фильтра Redis для поиска источников журналов, которые нельзя изменить и которые предоставляют только числовые ссылки на определенные объекты, но для которых нам нужны имена для простоты поиска. Я не знаю, насколько это будет связано, но это должно быть выполнимо.