2

私はlogstashで遊んでいて、複数行フィルターを試してみたかった. 複数行のコンテンツを含むことができる単一のファイルを解析しようとしています。複数行フィルターを使用していますが、本来の方法で機能しません。ファイルには次の内容があります。

2014-10-11 10:10:10 xxxx yyyy
2013-09-12 11:11:11 aaaa bbbb
2012-01-01 10:10:10 cccc dddd
2011-10-12 01:01:01 mmmm Nan

Grok パターンを使用

CUSTOMTIME %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}

私はlogstashで次の設定ファイルを使用しています

input {
    file{
        path => "/Users/akshayanilkapoor/Kumo/logs/akshay"
        codec => multiline {
            pattern => "^.*"
            what => "previous"
            negate => true
        }
    }
   stdin{
        codec => multiline {
            pattern => "^%{CUSTOMTIME}"
            what => "previous"
            negate => true
        }
     }
}
filter {
   grok {
        patterns_dir => "./patterns"
        match => ["message", "%{CUSTOMTIME:date1} %{GREEDYDATA:lumber-type} %{GREEDYDATA:lumber-desc}"]
        }
    }

output {
    stdout {codec => rubydebug}
}

上記のデータをstdinからコピーして貼り付けると、期待どおりに機能します。つまり、ファイル内のすべてのイベントを含むメッセージとともに出力が表示されます。ファイルで同じものを渡すと、ログエントリごとに異なるメッセージが出力されます。つまり、4 つの異なるログイベントが表示されます (これは私が望むものではありません)。

注:複数行とともに次のオプションを使用してみましたが、

  1. (?m) grok の複数行モードであり、それもまったく役に立ちません。
  2. また、mutate フィルターを使用して "\n" を " " に置き換え、それを grok で解析しました。

私が犯してきた非常にばかげた間違いがあると思います。または、実装するフィルターを正しく理解していません。どんな助けでも大歓迎です!

4

1 に答える 1

0

予想どおり、複数行コーデックの否定オプションを誤って誤解しました:p これは、誰かを助けるために構成を機能させるために使用した構成ファイルです。

input {
    file{
        path => "/Users/akshayanilkapoor/Kumo/logs/akshay"
        codec => multiline {
            pattern => "^[0-9]"
            what => "previous"
            #negate => true
        }
    }
   stdin{
        codec => multiline {
            pattern => "^[a-z]"
            what => "previous"
            negate => "true"
        }
     }
}

filter {
    grok {
        match => ["message", "(?m)%{RSMROLLBACKTIME:date1} %{GREEDYDATA:lumber-type} %{GREEDYDATA:lumber-desc}"]
    }
}

output {
    stdout {codec => rubydebug}
}
于 2014-09-10T01:15:51.820 に答える