Logstash - грок многострочный

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

Мои журналы

H3|15:55:04:760|exception|not working properly
message:space exception
 at line number 25

Мой файл конфигурации

input { file {

    path => "logs/test.log"
    start_position => beginning
    sincedb_path => "/dev/null"
  }}
filter{

 multiline {

    pattern => "^(\s|[A-Z][a-z]).*"
    what => "previous"
  }
if [message] =~ /H\d+/{

grok {

match => ["message", "(?m)%{USERNAME:level}\|%{TIME:timestamp}\|%{WORD:method}\|%{GREEDYDATA:error_Message}" ]
  }
   }

   else {

   grok {

match => ["message", "(?m)%{GREEDYDATA:error_Message}" ]
  }
   }
  }

output {elasticsearch { host => "localhost"  protocol => "http" port => "9200" }}

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

Вывод, который я хотел бы иметь

{

"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"level"=>"H3"
"timestamp"=>15:55:04:760
"method"=>exception
"error_message"=>not working properly
},
{
"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"error_message" => "space exception at line 25"
}   

Пожалуйста, помогите мне получить требуемый результат.


person raj    schedule 02.04.2015    source источник
comment
Как вы думаете, что соответствует вашему регулярному выражению? ^(\s|[AZ][az]).*   -  person Alain Collins    schedule 02.04.2015
comment
Привет, Ален, я новичок в logstash и этом многострочном, я думал, он проверит, начинается ли первая буква с пробела.   -  person raj    schedule 06.04.2015


Ответы (1)


Ваша многострочная конфигурация говорит: «Если я найду этот шаблон, оставьте его с предыдущей строкой».

Ваш шаблон "^(\s|[A-Z][a-z]).*" говорит "либо пробел, либо заглавная буква, за которой следует строчная буква, а затем другие вещи".

Таким образом, «foo» или «California» будут соответствовать, а «H3» — нет.

Я бы предложил шаблон, который соответствует началу вашего многострочного выражения, и использовал функцию «отменить», чтобы все строки, которые не соответствуют этому шаблону, присоединялись к исходной строке:

filter {
    multiline {
      pattern => "^[A-Z][0-9]\|"
      negate => 'true'
      what => 'previous'
    }
  }
}

Это займет "H3 |" линию в качестве начала и присоедините к ней все остальные строки. В зависимости от диапазона значений в начале строки вам может понадобиться отредактировать регулярное выражение.

person Alain Collins    schedule 06.04.2015