Logstash grok过滤器帮助 - 固定位置文件

6
我有一个固定位置(列)的文件,其中没有分隔符来分开各个字段。每个字段都有自己的起始位置和长度。以下是数据示例:
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 解析这种文件?
1个回答

13

我建议采用两个步骤:

  • 将数据拆分为字段
  • 从每个字段的末尾剥离空数据

由于每个字段都具有已知的长度,因此您可以使用类似于.{27}的正则表达式模式来匹配它们。

在grok中,您可以如下命名一个字段:(?<user_id>.{27})

您可以在 grok调试器中测试完整模式,但是像这样的模式应该可以实现基于长度的拆分:

(?<user_id>.{27})(?<system_id>.{22})(?<sample_id>.{13})(?<line_id>.{8})(?<text>.{48})(?<ip>.{15})
您提到您的额外字符都是空格,因此您可以使用 mutate filterstrip 选项 来清理它们。

综合起来,可能会像这样:

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"
        ]
    }
}

嗨,提供的Grok调试器链接已经失效了。Kibana也提供了一个用于Logstash的Grok调试器:https://www.elastic.co/guide/en/kibana/8.10/xpack-grokdebugger.html - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接