Не отображаются dns-логи в Kibana

В rsyslog elk-сервера с двух ns-серверов с named (как я понял - bind4) пересылаются логи запросов.
Пример логов:

Sep 17 11:05:33 central.ns.1 named[13705]: 17-Sep-2020 11:05:33.399 client 10.127.0.9#50507 (19.img.avito.st): query: 19.img.avito.st IN A +EDC (10.127.4.28)
Sep 17 11:05:34 central.ns.2 named[16335]: 17-Sep-2020 11:05:33.411 client 10.127.0.8#54091 (api.aliradar.com): query: api.aliradar.com IN A +EDC (10.127.4.30)

Filebeat настроен забирать логи:

  - input_type: log
  path:
       - /opt/log/dns/*.log
  document_type: dns-query

По выводу логов filebeat, как я понимаю, сбор им логов начался успешно:

Для logstash создан фильтр (grok) для парсинга логов dns:

elseif [type] == "dns-query" {
 grok { 
 match => { "message" => '%{MONTH:syslog_month} +%{MONTHDAY:syslog_day} %{TIME:syslog_time} %{IPORHOST:syslog_hostname} %{WORD:syslog_tag}: %{BIND9_TIMESTAMP:timestamp} client %{IP:clientip}#%{POSINT:clientport} \(%{GREEDYDATA:query_one}\): query: %{GREEDYDATA:query_two} IN %{GREEDYDATA:querytype} \(%{IP:dns}\)' }
}

Проблема в том, что логи не отображаются в Кибане. Подскажите, в чём может быть ошибка или где её можно её отследить?

а в кибану ее должен доставить или логстеш или сам эластик, с каким-то индексом.
cоостветственно проверьте ностройку секций в filebeat.yml
logstash output или elasticsearch
ну и дополнительно проверьте telnet-ом порты

С портами и основными настройками logstash, filebeat и elasticsearch (он доставляет в Kibana) не должно быть проблем: до меня на этом сервере все преднастроил мой предшественник, чтобы забирать логи Nginx и Postfix (собственно они и забираются, а моя задача добавить к ним ещё и DNS-запросы).

так filebeat не вы настраивали? индекс там какой настроен в конфиге?

Блок в filebeat для dns настраивал я (пример выше). Вы индекс какой ввиду имеете? Который elasticsearch обрабатывает?

Что явно не так с самим логами dns-запросов. Отключил все фильтры и просто "в чистую" отдаю все логи - nginx'а и postfix'а логи доходят, а dns'а всё также нет. В текстовым редакторах они открываются нормально, каких-либо ошибок я в них не вижу.

На вскидку этот паттерн не должен работать с вашими записями. А поигрался с ним в grok debugger и у меня все ломается уже на первом hostname. Я бы попробовал отладить grok в отдельно-стоящем logstash, чтобы убедиться, что все работает.

1 Like

Спасибо за рекомендацию! Даже с полностью закомментарированными grok (и даже всеми фильтрами) логи nginx'а и postfix'а уходят, а dns'а - нет. Видимо проблема не только с плохо написанными паттернами?

Вы не знаете подходящих специфичных паттернов для Named(Bind 4) хотя бы для timestamp? Не могу нигде их найти: ни в официальной документации, ни просто на обыкновенных сайтах.

Нашёл проблему: было установлено условие if "_grokparsefailure" in [tags] {
drop {} }. Осталось понять почему все днс-логи пересылаемые в Кибану помечаются этим тэгом. И соответственно откидываются фильтром.

document_type и elseif [type] == "dns-query" { так же выглядит подозрительно. Во первых пробелов там явно не хватает, да и потом мы типы больше не используем. Я бы вместо него просто fields добавил и проверил, что он там действительно появляется.

Я несколько подправил grok. Но как я написал выше - проблема в тэге. Если закомментировать блок if "_grokparsefailure" in [tags] {
drop {} } , то до Кибаны доходит (видно в Дискавери), но паттерны не применяются. Нет возможности настроить Дашборд и графики. Все что доходит до Кибаны помечается тэгом _grokparsefailure. Пытаюсь понять почему.

Возможно проблема в кодировке syslog'а? Но почему тогда нет таких же тэгов у nginx и postfix логов, которые также по rsyslog собираются...

_grokparsefailure означает, что грок не может разобрать запись.

1 Like