web-dev-qa-db-ja.com

Logstash grok複数行メッセージ

私のログは次のようにフォーマットされています:

2014-06-19 02:26:05,556 INFO ok
2014-06-19 02:27:05,556 ERROR
 message:space exception
         at line 85
 solution:increase space
          remove files   

イベントには2つのタイプがあります。

-最初のように1行でログ

-2番目のような複数行でログ

1行のイベントを処理することはできますが、メッセージを1つの変数に保存し、ソリューションを別の変数に保存する2番目のタイプを処理することはできません。

これは私の設定です:

input {
 file {
    path => ["logs/*"]
    start_position => "beginning"
    codec => multiline {
                   pattern => "^%{TIMESTAMP_ISO8601} "
                   negate => true
                   what => previous
    }       
 }
}
filter {
 #parsing of one line event
 grok {
 patterns_dir => "./patterns"
 match=>["message","%{TIMESTAMP_ISO8601:timestamp} %{Word:level} ok"]
 }
#the parsing fail, so we assumed we are in multiline events, now I process them and I am stuck when I am getting to the new line.
if "_grokparsefailure" in [tags] {
 grok {
 patterns_dir => "./patterns"
 match=>["message","%{TIMESTAMP_ISO8601:timestamp} %{Word:level}\r\n"]
 }
}

}

これが私がやったことであり、コンソール出力に次のようにしたいと思います:

{
"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"level"=>"INFO"
},
{
"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"level"=>"ERROR"
"message" => "space exception at line 85"
"solution"=>"increase space remove files"
}

具体的には、2つの単語(メッセージ変数の「メッセージ」と「ソリューション」、「ソリューション」とソリューション変数のイベントの終了)の間のすべての式を取得します。または複数行。

前もって感謝します

21
user2443476

複数行のgrokに関しては、パターン文字列に特別なフラグを使用するのが最善です:

grok {
    match => ["message", "(?m)%{SYSLOG5424LINE}"]
}
22

次の2つの問題があるようです。

複数行を正しく組み合わせる必要があります:

filter
{
    multiline
   {
        pattern => "^ "
        what => "previous"
   }
}

これは、スペースで始まる行を前の行に結合します。 「前」ではなく「次」を使用しなければならない場合があります。

改行の置換

Grokが改行間で一致するとは思わない。

これを回避するには、フィルターセクションで次の操作を行います。これはbefore grokセクションに行くはずです:

mutate
{
    gsub => ["message", "\n", "LINE_BREAK"]
}

これにより、「\ n」まで一致するだけでなく、複数行を1つの大きな行として扱うことができました。

12
alexpotato