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

**URL:** <https://discuss.elastic.co/t/logstash-grokdebugger/206660>\
**Category:** Вопросы на русском языке\
**Created:** [November 5, 2019, 6:33pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660 "2019-11-05T18:33:56Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![artem33region](https://avatars.discourse-cdn.com/v4/letter/a/f07891/32.png) [@artem33region](https://discuss.elastic.co/u/artem33region)\
**Post date:** [November 5, 2019, 6:33pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/1 "2019-11-05T18:33:56Z")

</div>

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

```auto
#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:

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

```

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

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

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 6, 2019, 12:53am UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/2 "2019-11-06T00:53:18Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![artem33region](https://avatars.discourse-cdn.com/v4/letter/a/f07891/32.png) [@artem33region](https://discuss.elastic.co/u/artem33region)\
**Post date:** [November 6, 2019, 4:32am UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/3 "2019-11-06T04:32:59Z")

</div>

```auto
<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,

```

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 6, 2019, 4:41pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/4 "2019-11-06T16:41:49Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![artem33region](https://avatars.discourse-cdn.com/v4/letter/a/f07891/32.png) [@artem33region](https://discuss.elastic.co/u/artem33region)\
**Post date:** [November 6, 2019, 7:49pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/5 "2019-11-06T19:49:31Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 6, 2019, 11:51pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/6 "2019-11-06T23:51:46Z")

</div>

> [@artem33region](#):
>
> Может еще подскажите как из числа например 360432 (количество минут) сделать время?

Рассчитать количество миллисекунд после 1 января 1970 в фильтре [ruby](https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html) и потом распарсить в формате UNIX в фильтре [date](https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html).

---

<div class="post-metadata">

**Author:** ![artem33region](https://avatars.discourse-cdn.com/v4/letter/a/f07891/32.png) [@artem33region](https://discuss.elastic.co/u/artem33region)\
**Post date:** [November 7, 2019, 1:42pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/7 "2019-11-07T13:42:02Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 7, 2019, 8:40pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/8 "2019-11-07T20:40:34Z")

</div>

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

> [@Парсинг логов в Logstash с помощью grok](https://discuss.elastic.co/t/logstash-grok/155037/5):
>
> может лучше воспользоваться [CSV фильтром](https://www.elastic.co/guide/en/logstash/6.4/plugins-filters-csv.html) и потом обрабатывать индивидуальные поля через grok

---

<div class="post-metadata">

**Author:** ![artem33region](https://avatars.discourse-cdn.com/v4/letter/a/f07891/32.png) [@artem33region](https://discuss.elastic.co/u/artem33region)\
**Post date:** [November 8, 2019, 4:28am UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/9 "2019-11-08T04:28:07Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![artem33region](https://avatars.discourse-cdn.com/v4/letter/a/f07891/32.png) [@artem33region](https://discuss.elastic.co/u/artem33region)\
**Post date:** [November 8, 2019, 8:58am UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/10 "2019-11-08T08:58:21Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 11, 2019, 2:43pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/11 "2019-11-11T14:43:28Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![artem33region](https://avatars.discourse-cdn.com/v4/letter/a/f07891/32.png) [@artem33region](https://discuss.elastic.co/u/artem33region)\
**Post date:** [November 13, 2019, 7:02am UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/12 "2019-11-13T07:02:39Z")

</div>

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

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

```

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

---

<div class="post-metadata">

**Author:** ![artem33region](https://avatars.discourse-cdn.com/v4/letter/a/f07891/32.png) [@artem33region](https://discuss.elastic.co/u/artem33region)\
**Post date:** [November 13, 2019, 8:21am UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/13 "2019-11-13T08:21:20Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 13, 2019, 2:30pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/14 "2019-11-13T14:30:36Z")

</div>

> [@artem33region](#):
>
> Но есть еще вопрос, хочу дропать сообщения в которых не содержится определенного значение

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

---

<div class="post-metadata">

**Author:** ![artem33region](https://avatars.discourse-cdn.com/v4/letter/a/f07891/32.png) [@artem33region](https://discuss.elastic.co/u/artem33region)\
**Post date:** [November 13, 2019, 7:46pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/15 "2019-11-13T19:46:19Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 13, 2019, 8:24pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/16 "2019-11-13T20:24:13Z")

</div>

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

Если 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`?

---

<div class="post-metadata">

**Author:** ![artem33region](https://avatars.discourse-cdn.com/v4/letter/a/f07891/32.png) [@artem33region](https://discuss.elastic.co/u/artem33region)\
**Post date:** [November 14, 2019, 4:27am UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/17 "2019-11-14T04:27:27Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![artem33region](https://avatars.discourse-cdn.com/v4/letter/a/f07891/32.png) [@artem33region](https://discuss.elastic.co/u/artem33region)\
**Post date:** [November 14, 2019, 4:36am UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/18 "2019-11-14T04:36:27Z")

</div>

> [@Igor\_Motov](#):
>
> Рассчитать количество миллисекунд после 1 января 1970 в фильтре [ruby](https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html) и потом распарсить в формате UNIX в фильтре [date](https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html).

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

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 14, 2019, 2:39pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/19 "2019-11-14T14:39:52Z")

</div>

> [@artem33region](#):
>
> и start или stop не содержится

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

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

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [December 12, 2019, 2:39pm UTC](https://discuss.elastic.co/t/logstash-grokdebugger/206660/20 "2019-12-12T14:39:53Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
