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

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

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

(?:,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 (хотя все поля(подстроки) ДО разбираются без ошибок):

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

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

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

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

А grok вам использовать обязательно? Если нет - я бы kv фильтром воспользовался, вроде он как раз то что вам надо делает.

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

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

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

Есть ли вариант, как обработать приведенное содержимое с помощью grok ?

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

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

В каждом message от 5 до 20 полей. Если честно, не понимаю, откуда она берется.

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

Я бы посоветовал создать отдельную конфигурацию для отладки, заменить там elasticsearch на stdout и посмотреть, а какие, собственно записи ваши фильтры формируют.

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

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

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

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

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

не нужно.

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