【问题标题】:Logstash grok filter help - fixed position fileLogstash grok 过滤器帮助 - 固定位置文件
【发布时间】:2019-02-15 16:58:55
【问题描述】:

我有一个固定位置(列)文件,其中没有分隔字段的分隔符。每个字段都有自己的起始位置和长度。以下是数据示例:

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 解析这种文件?

【问题讨论】:

    标签: logstash logstash-grok


    【解决方案1】:

    我会采用两步流程:

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

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

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

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

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

    您提到您的多余字符都是空格,因此您可以使用mutate filterstrip option 来清理它。

    所有这些,可能看起来像这样:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多