【问题标题】:How to parse syslog message using logstash如何使用 logstash 解析系统日志消息
【发布时间】:2021-09-25 07:32:07
【问题描述】:

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

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

我想从 syslog 中提取 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

【问题讨论】:

  • 解析message 字段的grok 模式应如下所示^pools/POOL nodes/IP:\d+ %{WORD:status} Node %{WORD:node_name};你也可以使用 dissect 过滤器,它更容易使用。

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


【解决方案1】:

您可以在使用%{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"

【讨论】:

  • 好的,我可以使用 dissect 拆分 %{SYSLOGLINE} 创建的消息字段吗?我已经用消息字段的内容更新了描述你可以看到它只是最后一部分不同
  • @TheCube 是的。当您使用 %{SYSLOGLINE} 解析消息时,它会创建新字段(并覆盖 message 字段。然后可以像其他字段一样使用这些字段。我将更新答案以使其更清晰
  • 谢谢,如果有帮助的话,我已经用消息字段的内容更新了描述
  • 感谢您的帮助。这很繁琐,但确实有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多