Фильтр grok Logstash — дублируется значение поля

#logstash #logstash-grok

#logstash #logstash-grok

Вопрос:

Мой фильтр logstash настроен следующим образом:

 filter {
  grok {
    patterns_dir => ["/usr/share/logstash/pipeline/patterns/"]
    match => {
      "[message]" => "%{TIMESTAMP_ISO8601:timestamp} %{THREAD:thread} %{LOGLEVEL:level} %{LOGGER:logger} %{CONTEXT:context} - %{GREEDYDATA:message}"
    }
  }
  mutate {
    rename => { "[fields][index]" => "application" }
    rename => { "[host][name]" => "instance" }
    remove_field => ["@version","agent.ephemeral_id","agent","ecs","fields","input","tags"]
  }
}
  

Отладчик Grok предполагает, что все в порядке, и для строки ошибки:

 2020-10-28 05:14:41,282 [Worker-5] DEBUG Amount  - calculate operation: [1], useCurrencyCodeOfPosition: [false]
  

Я получаю следующий результат:

 {
  "level": "DEBUG",
  "logger": "Amount",
  "context": "",
  "thread": "Worker-5",
  "message": "calculate operation: [1], useCurrencyCodeOfPosition: [false]",
  "timestamp": "2020-10-28 05:14:41,282"
}
  

Шаблоны определяются следующим образом:

 THREAD [(?<thread>[^]]*)]
LOGGER (?<logger>[^ ]*)
CONTEXT (?<context>[^-]*)
  

Теперь каждое значение, созданное фильтром grok, дублируется, как показано в примере ниже:

              "logger" => [
    [0] "Amount",
    [1] "Amount"
],
             "thread" => [
    [0] "[Worker-5]",
    [1] "Worker-5"
  

В чем здесь проблема?
Я просто не могу понять это.
Это мой первый фильтр :).
Я работаю с Logstash 7.9.2 (dockerized)

Комментарии:

1. Это должно иметь какое-то отношение к моим пользовательским шаблонам… просто пока не знаю, что :/

2. «Встроенные» шаблоны работают так, как ожидалось, но я бы не подумал, что это предпочтительный способ :/

Ответ №1:

Я думаю, что есть проблемы с пользовательскими шаблонами в фильтре. То, что вы хотите, также может быть достигнуто простым использованием готовых шаблонов, как показано ниже

 filter{
 grok {
    match => {
      "message" => "%{TIMESTAMP_ISO8601:timestamp}%{SPACE}[%{DATA:thread}]%{SPACE}%{LOGLEVEL:level}%{SPACE}%{NOTSPACE:logger} %{DATA:context}-%{SPACE}%{GREEDYDATA:message}"
    }
    overwrite => [ "message" ]
  }
  mutate {
    rename => { "[fields][index]" => "application" }
    rename => { "[host][name]" => "instance" }
    remove_field => ["@version","agent.ephemeral_id","agent","ecs","fields","input","tags"]
  }
}
  

Проверьте эту ссылку шаблонов grok по умолчанию. Если вам нужно провести анализ временных рядов по этим событиям, я бы посоветовал вам переопределить @timestamp timestamp или, по крайней мере, применить фильтр даты timestamp .

Если вы ожидаете фиксировать многострочные ошибки трассировки стека, рассмотрите возможность использования многострочного фильтра в плагине ввода.

Комментарии:

1. Спасибо за это. Что не так с моими шаблонами, ты? Должно быть, я что-то упускаю.

2. @ m0rt1m3r Регулярное выражение, используемое для пользовательских шаблонов, не соответствует требуемым шаблонам в вашем журнале. Пожалуйста, проголосуйте — примите ответ, если он разрешает ваш запрос :).

3. Я не согласен. На выходе вы можете четко видеть, что извлекаются значения, то есть регулярные выражения в порядке. Я просто не понимаю, почему мои пользовательские шаблоны не работают (они находят значения, но значения дублируются). Я что-то делаю неправильно.

4. О, да, теперь я понимаю. ваши шаблоны на самом деле отвечают за несколько совпадений. Попробуйте их в автономном режиме в регулярном выражении101.

5. Да, как упоминалось ранее. Встроенные регулярные выражения работают нормально. Я просто хочу понять, что я делаю не так с пользовательскими шаблонами. 🙂