logstash 配置文件的 Grok 模式

Grok pattern for logstash configuration file

下面是从 spring 应用程序生成并尝试创建自定义 grok 过滤器的日志

{"@timestamp":"2021-02-19T10:27:42.275+00:00","severity":"INFO","service":"capp","pid":"19592","thread":"SmsListenerContainer-9","class":"c.o.c.backend.impl.SmsBackendServiceImpl","rest":"[SmsListener] [sendSMS] [63289e8d-13c9-4622-b1a1-548346dd9427] [synemail] [ABSENT] [synfi] [0:0:0:0:0:0:0:1] [N/A] [N/A] [End Method]"}

应用过滤器后的预期输出是

id   => "63289e8d-13c9-4622-b1a1-548346dd9427"
token1   => "synemail"

首先,我建议将文本解析为 json 以将“rest”值提取到字段中。然后,假设“rest”值总是具有相同的结构,特别是 id 总是在第三个 [] 块内,而 token 总是在第四个 [] 内,这个 grok 规则应该有效为你

\[%{DATA}\] \[%{DATA}\] \[%{DATA:id}\] \[%{DATA:token1}\]

请注意,您始终可以使用 Grok 调试器在 Kibana 中测试您的 grok 规则:https://www.elastic.co/guide/en/kibana/7.11/xpack-grokdebugger.html

如果你不想在没有预处理的情况下直接将 grok 应用到 json,这是规则:

"rest":"\[%{DATA}\] \[%{DATA}\] \[%{DATA:id}\] \[%{DATA:token1}\]

根据OP评论更新:

假设您正在解析的字段是“消息”并且它的值是一个 json 作为带有转义引号的文本,Logstash grok 过滤器的完整配置类似于:

grok {
   match => { "message" => '\"rest\":\"\[%{DATA}\] \[%{DATA}\] \[%{DATA:id}\] \[%{DATA:token1}\]' }
}