为具有不同结构的文件查找 grok 模式
Finding grok pattern for file with varying structure
我有一个日志文件,其中并非所有行的格式都相同。如何找到此类文件的正确 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!!
这样,很少的行是第1行的格式,很少是第2行的格式等等。我可以为每一行写一个 grok 模式,但我不知道如何组合它们。有什么办法可以解决这个问题吗?
我已经为你整理了一些东西。但在与您分享之前,我建议您使用在线 GROK 调试器来编写您的 GROK 模式(如果您在 Dev Tools -> GROK 调试器下使用它,则 Kibana 中有 1 个)。
您还应该查看 available GROK patterns.
我看到所有 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中的以下字段:
我有一个日志文件,其中并非所有行的格式都相同。如何找到此类文件的正确 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!!
这样,很少的行是第1行的格式,很少是第2行的格式等等。我可以为每一行写一个 grok 模式,但我不知道如何组合它们。有什么办法可以解决这个问题吗?
我已经为你整理了一些东西。但在与您分享之前,我建议您使用在线 GROK 调试器来编写您的 GROK 模式(如果您在 Dev Tools -> GROK 调试器下使用它,则 Kibana 中有 1 个)。 您还应该查看 available GROK patterns.
我看到所有 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中的以下字段: