如何使用logstash解析系统日志消息

时间:2021-07-16 13:34:58

标签: logstash elastic-stack logstash-grok logstash-configuration elk

嗨,我有一个由两个事件组成的系统日志

Jul  6 13:24:27 NODE1 zeus.eventd[14176]: pools/POOL nodes/IP:3000 nodefail Node NODE2 has failed - A monitor has detected a failure

Jul  6 13:24:34 NODE1 zeus.eventd[14176]: pools/POOL nodes/IP:3000 nodeworking Node NODE2 is working again

我想从系统日志中提取 NODE2 并将其添加为索引中的一个字段以及 nodefail/nodeworking

目前我的输入/grok是

   syslog {
       grok_pattern => "%{SYSLOGLINE}"
   }

没有过滤器,但是我需要的所有信息都填充在“消息”字段中,因此我无法在弹性中使用它

我知道我想要在 syslog 行中的位置我只需要将其拉出并将其添加为字段

有人能告诉我实现这个目标所需的输入/过滤器配置吗?

谢谢,

魔方

编辑:消息字段如下所示:

zeus.eventd 14176 - - SERIOUS   pools/POOL  nodes/IP:3000   nodefail    Node NODENAME has failed - A monitor has detected a failure
zeus.eventd 14176 - - INFO  pools/POOL  nodes/IP:3000   nodeworking Node NODENAME is working again

1 个答案:

答案 0 :(得分:2)

您可以在使用 %{SYSLOGLINE} 解析时创建的消息字段上使用 dissect filter plugin

dissect {
  mapping => {
    "message" => "%{} %{} %{status} %{} %{node_name} %{}"
  }
}

或者第二个 grok 过滤器,应用于使用 %{SYSLOGLINE} 解析时创建的消息字段,使用以下模式:

^pools/POOL nodes/IP:\d+ %{WORD:status} Node %{WORD:node_name}

在这两种情况下,根据您问题中给出的日志,您都会得到以下结果:

"status":"nodefail"
"node_name":"NODE2"

"status":"nodeworking"
"node_name":"OFSVDBM101"