所以我有一个非常简单的管道:
input { ... }
filter {
grok {
match => [ "message", "%{TIMESTAMP_ISO8601} %{LOGLEVEL:level} (?<logmessage>.*)" ]
add_tag => [ "java" ]
}
}
output { ... }
我想将匹配的消息标记为";java";,grok模式用于在Java消息的情况下提取日志级别,并消除时间戳。
然而,它只识别DEBUG日志,不识别其他日志,无一例外。因此,当在Kibana:上查看时,此日志被正确解析和标记
2021-07-07 12:34:56.789 DEBUG 1 --- [ scheduling-1] blah blah
但这不是:
2021-07-07 12:34:56.789 INFO 1 --- [ scheduling-1] blah blah
Kibana的grok调试器在这两种情况下都适用于该模式。
已经尝试了一些或多或少复杂的grok模式来更好地匹配消息。还尝试将日志级别定义为WORD类型。它使我难以想象。
我确实用非常小的更改从Kibana中复制了这些内容,但评论者的做法是正确的。我本应该在原始应用程序中寻找它们,而不是在Kibana上,因为在某个步骤中,日志消息中多余的空白被修剪掉了。
因此,问题中可以看到的内容最初是用一些填充物打印的:
2021-07-07 12:34:56.789 DEBUG 1 --- [ asd-1] blah blah
2021-07-07 12:34:56.789 INFO 1 --- [ scheduling-1] blah blah
为了将来参考,我通过用一个匹配任意数量的选择器替换模式中的文字空白来规避这个问题:
filter {
grok {
match => [ "message", "%{TIMESTAMP_ISO8601}%{SPACE}%{LOGLEVEL:level}%{SPACE}(?<logmessage>.*)" ]
}
}