как извлечь часть поля и сохранить ее в другом поле в фильтре logstash?

У меня есть файлы системного журнала. Я использую фильтр плагина logstash syslog для обработки этих журналов. Я получаю сообщения в поле syslog_message, например:

syslog_message:[cdp/interface.ERR] - {- -} Error writing CDP frame on system. Link is down

Но мне нужно новое поле, которое должно содержать только часть до .ERR, то есть «cdp / interface». Эта часть варьируется, и я не знаю, сколько типов будет. Итак, мне нужно новое поле, и я хочу сохранить эту часть в этом поле, чтобы я мог построить количество этих терминов в кибане.

текущая конфигурация logstash:

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]

    }
    date {
      target => "syslog_timestamp"
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }

После добавления нового grok в файл конфигурации, как это было предложено @Val

grok {
  match => { "syslog_message" => "\[%{PROG:syslog_type}\.%{LOGLEVEL:syslog_level}\] %{GREEDYDATA:syslog_message}" }
}

Для некоторых входных данных происходит grokparsefailure.
Вот некоторые строки, для которых он не работает:

syslog_message: [hald.INFO]: Support query handler called
syslog_message:[mgmtd.INFO]: Finished database commit

Любая помощь будет оценена по достоинству. Спасибо


person sabya    schedule 21.09.2016    source источник
comment
Как выглядит ваша текущая конфигурация Logstash?   -  person Val    schedule 21.09.2016
comment
я редактировал с текущей конфигурацией logstash @Val   -  person sabya    schedule 21.09.2016


Ответы (1)


Вы можете добавить еще один шаблон в свой основной grok фильтр или добавить еще grok фильтр только для поля syslog_message

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]

    }
    # ====> add this <====
    grok {
      match => { "syslog_message" => "\[%{PROG:syslog_type}\.%{LOGLEVEL:syslog_level}\]:? %{GREEDYDATA:syslog_message}" }

    }
    date {
      target => "syslog_timestamp"
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }

В результате вы получите два дополнительных поля, а именно:

  • syslog_type: cdp/interface
  • syslog_level: ERR

и syslog_message будет содержать только это - {- -} Error writing CDP frame on system. Link is down

person Val    schedule 21.09.2016
comment
эй, спасибо за быструю помощь, но я получаю grokparsefailure для многих входных данных, например syslog_message: [hald.INFO]: обработчик запросов поддержки вызвал такие входные журналы, я получаю grokparsefailure. @Val - person sabya; 21.09.2016
comment
Пожалуйста, обновите свой вопрос, добавив в журнал несколько сбойных строк. - person Val; 21.09.2016
comment
Я редактировал с двумя входными журналами, для которых он не работает @Val. Можете ли вы изучить это? - person sabya; 21.09.2016
comment
Я изменил свой ответ, пожалуйста, посмотрите - person Val; 21.09.2016
comment
привет, спасибо за вашу быструю помощь @Val - person sabya; 21.09.2016
comment
Рад, что помог! - person Val; 21.09.2016