# Разбор "необязательных" полей лога, состоящих только из символов кириллицы

**URL:** <https://discuss.elastic.co/t/topic/276701>\
**Category:** Вопросы на русском языке\
**Created:** [June 22, 2021, 7:53pm UTC](https://discuss.elastic.co/t/topic/276701 "2021-06-22T19:53:13Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![lkfmasd](https://avatars.discourse-cdn.com/v4/letter/l/2bfe46/32.png) [@lkfmasd](https://discuss.elastic.co/u/lkfmasd)\
**Post date:** [June 22, 2021, 7:53pm UTC](https://discuss.elastic.co/t/topic/276701/1 "2021-06-22T19:53:13Z")

</div>

Добрый день.  
Есть лог вида MethodName, Level, Process, A=Value1,B=Value2,C=Иванов Иван Иванович,D=Value3,E=Value4.

Поля(подстроки лога) A=Value1,B=Value2,C=Иванов Иван Иванович,D=Value3,E=Value4 являются необязательными и кажое поле может как присутствовать в логе, так и отсутствовать в нем.  
Для разбора использую grok:

```auto
(?:,A=%{WORD:log_A})?(?:,B=%{WORD:log_B})?(?:,C=%{DATA:log_C})?(?:,D=%{WORD:log_D})?(?:,E=%{WORD:log_E})?

```

т.е. именно для поля со значением ",Иванов Иван Иванович" использую ?`(?:,C=%{DATA:log_C})`  
Проблема в том, что в grok debugger указанное поле принимает значение пустой строки, а все последующие за ним поля значение null (хотя все поля(подстроки) ДО разбираются без ошибок):

```auto
"log_C": [
    [
      ""
    ]
  ],
  "log_D": [
    [
      null
    ]
  ],
  "log_E": [
    [
      null
    ]

```

По-моему, варианта два:

- либо я некорректно разбираю "необязательные" поля, используя `(?:,<Содержимое>)?`
- либо, для поля "Иванов Иван Иванович" использую не тот шаблон grok (сейчас DATA)

Подскажите пожалуйста, как решить проблему

---

<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:** [June 23, 2021, 12:41am UTC](https://discuss.elastic.co/t/topic/276701/2 "2021-06-23T00:41:48Z")

</div>

А grok вам использовать обязательно? Если нет - я бы [kv](https://www.elastic.co/guide/en/logstash/current/plugins-filters-kv.html) фильтром воспользовался, вроде он как раз то что вам надо делает.

---

<div class="post-metadata">

**Author:** ![lkfmasd](https://avatars.discourse-cdn.com/v4/letter/l/2bfe46/32.png) [@lkfmasd](https://discuss.elastic.co/u/lkfmasd)\
**Post date:** [June 23, 2021, 6:11am UTC](https://discuss.elastic.co/t/topic/276701/3 "2021-06-23T06:11:19Z")

</div>

Игорь, вроде kv - то, что нужно, но по дефолту разбор строки лога выполняется некорректно - поля разбиваются по пробелу в строке "Иванов Иван Иванович", игнорируются запятые.

Делаю следующую настройку:  
kv  
{  
field\_split =\> ","  
}  
Получаю ошибку logstash при обработке лога:  
Could not index event to Elasticsearch..."Limit of total fields [1000] has been exceeded"

---

<div class="post-metadata">

**Author:** ![lkfmasd](https://avatars.discourse-cdn.com/v4/letter/l/2bfe46/32.png) [@lkfmasd](https://discuss.elastic.co/u/lkfmasd)\
**Post date:** [June 23, 2021, 6:42am UTC](https://discuss.elastic.co/t/topic/276701/4 "2021-06-23T06:42:26Z")

</div>

Даже если в принципе вернуть все настройки по дефолту и дать лог среднего размера (в моем случае примерно 15Mb), то logstash выводит ту же ошибку о превышении лимита на 1000 полей.

Есть ли вариант, как обработать приведенное содержимое с помощью 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:** [June 23, 2021, 2:42pm UTC](https://discuss.elastic.co/t/topic/276701/5 "2021-06-23T14:42:06Z")

</div>

> "Limit of total fields [1000] has been exceeded"

Вы понимаете, что означает эта ошибка?

---

<div class="post-metadata">

**Author:** ![lkfmasd](https://avatars.discourse-cdn.com/v4/letter/l/2bfe46/32.png) [@lkfmasd](https://discuss.elastic.co/u/lkfmasd)\
**Post date:** [June 23, 2021, 2:44pm UTC](https://discuss.elastic.co/t/topic/276701/6 "2021-06-23T14:44:45Z")

</div>

В каждом message от 5 до 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:** [June 23, 2021, 2:57pm UTC](https://discuss.elastic.co/t/topic/276701/7 "2021-06-23T14:57:32Z")

</div>

Это ошибка означает, что в совокупности, по всем записям количество разных названий полей превысило 1000. То есть если одно поле содержит guid в названии, то вы получите эту ошибку через меньше чем 1000 записей.

Я бы посоветовал создать отдельную конфигурацию для отладки, заменить там elasticsearch на [stdout](https://www.elastic.co/guide/en/logstash/current/plugins-outputs-stdout.html) и посмотреть, а какие, собственно записи ваши фильтры формируют.

---

<div class="post-metadata">

**Author:** ![lkfmasd](https://avatars.discourse-cdn.com/v4/letter/l/2bfe46/32.png) [@lkfmasd](https://discuss.elastic.co/u/lkfmasd)\
**Post date:** [June 23, 2021, 3:43pm UTC](https://discuss.elastic.co/t/topic/276701/8 "2021-06-23T15:43:33Z")

</div>

Я думаю, что полей действительно очень много, guid не участвует в формировании имени поля.  
Сейчас реализована следующая цепочка: Filebeat -\> Logstash -\> ElasticSearch.

В таком случае, есть ли возможность отправлять из Filebeat в Logstash только строки лога, содержащие определенные значения методов: MethodA, MethodB MethodC...MethodX?  
Т.е. анализировать в Logstash строки, относящиеся только к интересующим меня методам; остальное в принципе и не нужно.

---

<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:** [June 23, 2021, 3:46pm UTC](https://discuss.elastic.co/t/topic/276701/9 "2021-06-23T15:46:36Z")

</div>

Я думаю, проще будет выбросить все, что вам не надо в Logstash.

---

<div class="post-metadata">

**Author:** ![lkfmasd](https://avatars.discourse-cdn.com/v4/letter/l/2bfe46/32.png) [@lkfmasd](https://discuss.elastic.co/u/lkfmasd)\
**Post date:** [June 23, 2021, 3:53pm UTC](https://discuss.elastic.co/t/topic/276701/10 "2021-06-23T15:53:05Z")

</div>

Игорь, подскажите пожалуйста, каким образом в Logstash можно отсечь ненужные нам строки и не отправлять их в ElasticSearch и при этом не получить указанную выше ошибку.  
Т.е., если в message нет любого из MethodA,...MethodX, то эту строку:

- раскладывать на поля в Logstash
- отправлять в ElasticSearch

не нужно.

---

<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:** [June 23, 2021, 6:48pm UTC](https://discuss.elastic.co/t/topic/276701/11 "2021-06-23T18:48:21Z")

</div>

> **[Drop filter plugin | Logstash Reference \[7.13\] | Elastic](https://www.elastic.co/guide/en/logstash/current/plugins-filters-drop.html)**

---

<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:** [July 21, 2021, 6:49pm UTC](https://discuss.elastic.co/t/topic/276701/12 "2021-07-21T18:49:02Z")

</div>

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