首页 > 解决方案 > 为具有不同结构的文件查找 grok 模式

问题描述

我有一个日志文件,其中并非所有行的格式都相同。如何为此类文件找到正确的 grok 模式。

[15:37:20:030|1] [TdmUtil.c: 1534:fnTDM_LoadLocalFoo] F_LAA       : 1
[15:37:20:032|1] [TdmUtil.c: 1281:fnTDM_GetPreDef]  pdeGetData : MAX_IRAT_NBR_PER_SERVED_CELL_SYS = 256
[15:37:20:091|1] [TdmUtil.c:  293:fnTDM_PrtIndexKey] fnTDM_GetIndexKeyNum Error!!

这样,很少有行采用 line1 的格式,很少有行采用 line2 的格式,依此类推。我可以为每一行写一个 grok 模式,但我不知道如何组合它们。有没有办法解决这个问题?

标签: logstashelastic-stacklogstash-grok

解决方案


我已经为你准备了一些东西。但在与您分享之前,我建议您使用在线 GROK 调试器来编写您的 GROK 模式(如果您在开发工具 -> GROK 调试器下使用它,则 Kibana 内部有 1 个)。您还应该查看可用的 GROK 模式

我看到所有 3 行都有相同的前缀,[time|num] [class: line number: function name] log text我为此创建了一个 GROK 模式。如果您想进一步分解,log text您可以通过取消注释该字段的第二场比赛text并提供所需的 grok 模式来做到这一点。

注意:您可以根据需要添加更多match部分,但请注意它会尝试在所有部分上运行匹配。尝试使用if else语句来浏览高复杂性 - 通常不需要它。

input {
    file {
        path => "C:/work/elastic/logstash-6.5.0/config/test.txt"
        start_position => "beginning"
        codec => multiline {
            pattern => "^\[%{TIME}\|"
            negate => true
            what => "previous"
        }
        type => "whatever"
    }
}
filter {
    if [type] == "whatever" {
        grok {
            break_on_match => false
            match => { "message" => "^\[%{TIME:time}\|%{NUMBER:num}\]%{SPACE}\[%{DATA:class}:%{SPACE}%{NUMBER:linenumber:int}:%{DATA:function}\]%{GREEDYDATA:text}$"}
            #match => { "text" => ""}
        }
    }
}

output {
    elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "test"
    }
}

上述配置文件将在 Kibana 中为您提供以下字段:

在此处输入图像描述


推荐阅读