Logstash не может распачрсить сообщение, а в grokdebugger парсит

Всем привет, есть конфиг:

#recieve syslog on Ports
input {
  tcp {
    port => 5044
    type => syslog
    tags => "ise"
  }
  udp {
    port => 5044
    type => syslog
    tags => "ise"
  }
}

filter {
  if "ise" in [tags] {
    grok {
      patterns_dir => ["/etc/logstash/paterns"]
      match => { "message" => "<181>%{WORD:month}  %{NUMBER:trash1} %{TIME:trash2} %{DATA:Server} %{DATA:type_r} %{DATA:trash3} %{NUMBER:trash4} %{NUMBER:trash5} %{DATE_12:Logged_at} %{DATA:trash6} %{NUMBER:trash7} %{NUMBER:trash8} %{WORD:facility} Radius-Accounting: %{DATA:type_request}, ConfigVersionId=%{NUMBER:trash9}, Device IP Address=%{IP:device_ip}, RequestLatency=%{NUMBER:trash10}, NetworkDeviceName=%{DATA:device_name}, User-Name=%{DATA:Identity}, NAS-IP-Address=%{IP:NAS-IP-Address}, NAS-Port=%{NUMBER:trash11}, Service-Type=%{DATA:trash12}, Framed-Protocol=%{DATA:protocol}, Framed-IP-Address=%{IP:Framed-IP-Address}, Class=%{DATA:class}, Called-Station-ID=%{IP:Called-Station-ID}, Calling-Station-ID=%{IP:Calling-Station-ID}, Acct-Status-Type=%{WORD:type_req}, Acct-Delay-Time=%{NUMBER:Delay}, Acct-Input-Octets=%{NUMBER:input_octets}, Acct-Output-Octets=%{NUMBER:output_octets}, Acct-Session-Id=%{DATA:session_id}, Acct-Authentic=%{DATA:acc_auth}, Acct-Session-Time=%{NUMBER:duration}, Acct-Input-Packets=%{NUMBER:input_packets}, Acct-Output-Packets=%{NUMBER:output_packets}, Acct-Terminate-Cause=%{DATA:Account_terminate_cause}, NAS-Port-Type=%{DATA:nas_port}, Tunnel-Client-Endpoint=%{DATA:trash14} %{IP:endpoint_id}, cisco-av-pair=mdm-tlv=device-platform=%{DATA:device_os}, cisco-av-pair=mdm-tlv=device-platform-version=%{DATA:device_os_version}, " }
    }
  }
}

#send data to elastic
output {
  if "ise" in [tags] {
    elasticsearch {
      hosts => ["http://127.0.0.1:9200"]
      index=>["ise-%{+YYYY.MM.dd}"]
    }
  }
}

Еще есть pattern:

DATE_12 %{YEAR}[/-]%{MONTHNUM}[/-]%{MONTHDAY}[ ]%{TIME}

В grokdebugger все парсится нормально, а вот в logstash нет, сообщение прилетает с тэгом _grokparsefailure.

PS: весь конфиг не влез, скопировал только тот шаблон по которому не парсится.

А что в message в этом сообщении?

1 Like
<181>Nov  5 21:52:47 CISCO-ISE-202 CISE_RADIUS_Accounting 0000016871 2 0 2019-11-05 21:52:47.131 +03:00 1145787346 3001 NOTICE Radius-Accounting: RADIUS Accounting stop request, ConfigVersionId=675, Device IP Address=103.20.99.122, RequestLatency=4, NetworkDeviceName=SECU-VPN, User-Name=LOCAL\\IVANOV_ii, NAS-IP-Address=103.120.76.11, NAS-Port=187080704, Service-Type=Framed, Framed-Protocol=PPP, Framed-IP-Address=190.160.182.120, Class=CACS:c0a801010b26a0005dc1bb1d:CISCO-ISE-202/329763269/41047019, Called-Station-ID=180.184.16.111, Calling-Station-ID=185.10.31.153, Acct-Status-Type=Stop, Acct-Delay-Time=0, Acct-Input-Octets=300830, Acct-Output-Octets=3748213, Acct-Session-Id=1C745F52, Acct-Authentic=RADIUS, Acct-Session-Time=2530, Acct-Input-Packets=4715, Acct-Output-Packets=5512, Acct-Terminate-Cause=Idle Timeout, NAS-Port-Type=Virtual, Tunnel-Client-Endpoint=(tag=0) 185.10.13.13, cisco-av-pair=mdm-tlv=device-platform=android, cisco-av-pair=mdm-tlv=device-platform-version=9,

У вас pattern ожидает пробел в конце, но в message у вас этого пробела нет.

1 Like

Вот это да...
Как это я не заметил!
Спасибо большое!
Может еще подскажите как из числа например 360432 (количество минут) сделать время?
Например в формате HH:MM:SS
Спасибо.

Рассчитать количество миллисекунд после 1 января 1970 в фильтре ruby и потом распарсить в формате UNIX в фильтре date.

1 Like

Игорь, можете еще подсказать один момент:
Например есть сообщение, сообщение большое, но первые объекты(поля) они всегда статичны, а после определенной точки объекты(поля) меняются местами.
Подскажите логику парсинга таких сообщений, каждый раз ловить сообщение с тэгом _grokparsefailure и создавать шаблон или есть какой то другой способ?

Для примера, приходит сообщение из 40 полей, первые 10 - статичны, а вторая часть из 30 всегда меняются, причем та часть которая меняется в ней могут быть не 30, а например 20 полей, или еще меньше.

У меня такое ощущение, что мы это уже обсуждали:

1 Like

А CSV фильтр, он разве не из файла берет данные?

Игорь, подскажите еще момент, можно ли дропать сообщение после парсинга grok по значению определенного поля?

https://www.elastic.co/guide/en/logstash/current/plugins-filters-drop.html

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

  if ([message] !~ "RADIUS Accounting start request" or [message] !~ "RADIUS Accounting stop request") {
    drop { }
  }

Я думаю это из за пробелов в значениях, но это не точно...
Что здесь может быть не так?

Такая конструкция тоже не работает, тоже дропается все...

  if "ise" in [tags] and ("RADIUS Accounting start request" not in [message] or "RADIUS Accounting stop request" not in [message]) {
    drop { }
  }

Вы написали конфиг который дропает сообщения в которых не содержатся все определенные значение. Если я вас правильно понял то or надо заменить на and в первом случае. Если, кончено, вы не ищите события в которых stop и start появляются одновременно.

1 Like

Логика какая, если в сообщение содержится start, его не дропать, так же и с stop.
Есть 4 вида сообщения которые приходят, в одном есть stop, а в другом старт, вот их нужно пропустить, а остальные дропать.

Ну тогда у вас получается вот что:

Если message ничего полезного не содержит то [message] !~ "start" or [message] !~ "stop" - > true or true -> true - дропаем

Если message содержит start то [message] !~ "start" or [message] !~ "stop" - > false or true -> true - дропаем

Если message содержит stop то [message] !~ "start" or [message] !~ "stop" - > true or false -> true - дропаем.

Если message содержит stop и start то [message] !~ "start" or [message] !~ "stop" - > false or false -> false - оставляем.

Теперь понятно почему все дропается, и почему надо or заменить на and?

1 Like

Не совсем)
Просто как я читаю свой конфиг, если у сообщения имеется тэг ise и start или stop не содержится в сообщении то дропать.
А вариант and как по мне выглядит так: если у сообщения имеется тэг ise и start и stop не содержится в сообщении то дропать.
Как по мне, оператор and говорит, что в сообщении не должны присутствовать start и stop, а в сообщении либо start либо stop либо что-то другое.
Теперь заменил на and и всё стало работать как нужно!
Огромное спасибо!

Игорь, а не могли бы вы подробней рассказать про этот метод? Что-то я ничего не нагуглил...

правильная формулировка была бы start не содержиться ИЛИ stop не содержиться или если применить закон де моргана не (start содержиться И stop содержиться).

Про ruby фильтр - поищете в разделе logstash там полно примеров.