Logstash 寻找变结构文件的grok模式

Logstash 寻找变结构文件的grok模式,logstash,elastic-stack,logstash-grok,Logstash,Elastic Stack,Logstash 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:

我有一个日志文件,其中并非所有的行都采用相同的格式。如何为这样的文件找到正确的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模式,但我不知道如何组合它们。有什么办法可以解决这个问题吗?

我为你准备了一些东西。但在我与您分享之前,我建议您使用在线GROK调试器来编写GROK模式(如果您在Dev Tools->GROK debugger下使用Kibana,则Kibana中有1个)。 你也应该看看这本书

我看到所有3行都有相同的前缀,即
[time | num][class:line number:function name]log 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中为您提供以下字段:


您想在一个事件中合并所有这些行,还是想使用grok解析这些行?现在还不清楚。你的日志行有一个共同的结构,你可以制作一个grok过滤器来解析共同的部分,而其他grok过滤器则用于非共同的部分。谢谢你的回复。是否可以使用多个grok筛选器来解析单个日志文件。在同一个grok筛选器中,您可以拥有所需的任意多个grok模式,只需添加另一个
match
行即可,您还可以拥有所需的任意多个grok筛选器。什么是当前日志存储配置?用它更新你的问题。