5

フィールドを区切る区切り文字がない固定位置 (列) ファイルがあります。各フィールドには、独自の開始位置と長さがあります。以下はデータの例です。

520140914191193386---------7661705508623855646---1595852965---133437--the lazy fox jumping over-----------------------212.75.12.85---

上記のデータのサンプルを示すためにダッシュ (-) を使用しましたが、実際のフィールドがスキーマで許可されているよりも短い場合、実際のファイルにはスペースが含まれます。

この場合のスキーマは次のとおりです。

UsedID (start position 1, length 27)
SystemID (start position 28, length 22)
SampleID (start position 50, length 13)
LineID (start position 63, length 8)
Text (start position 71, length 48)
IP (start position119, length 15)

理想的には、logstash で次のフィールド値を取得します (末尾のスペースなし)。

UsedID:520140914191193386
SystemID:7661705508623855646
SampleID:1595852965
LineID:133437
Text:the lazy fox jumping over
IP:212.75.12.85

この種のファイルを grok で解析するにはどうすればよいですか?

4

1 に答える 1

11

私は2段階のプロセスに行きます:

  • データをフィールドに分割する
  • 各フィールドの末尾から空のデータを取り除く

各フィールドの長さは既知であるため、正規表現パターンを使用.{27}して一致させることができます。

grok では、次のようにフィールドに名前を付けることができます。(?<user_id>.{27})

grok debuggerで完全なパターンをテストできますが、次のようなものは長さベースの分割を実現する必要があります。

(?<user_id>.{27})(?<system_id>.{22})(?<sample_id>.{13})(?<line_id>.{8})(?<text>.{48})(?<ip>.{15})

余分な文字はすべて空白だとおっしゃいましたが、mutate フィルターstrip オプションを使用してクリーンアップできます。

まとめると、次のようになります。

filter {
    grok {
        match => ["message", "(?<user_id>.{27})(?<system_id>.{22})(?<sample_id>.{13})(?<line_id>.{8})(?<text>.{48})(?<ip>.{15})"]
    }

    mutate {
        strip => [
            "user_id",
            "system_id",
            "sample_id",
            "line_id",
            "text",
            "ip"
        ]
    }
}
于 2014-09-14T22:57:41.840 に答える