如何区分类似日志的 grok 过滤器

How to distinct grok filter for similar logs

我有这样的日志用于 dhcpack:

Jun 30 06:34:18 HOSTNAME dhcpd: DHCPACK to IP (MAC) via eth2

Jun 30 06:34:28 HOSTNAME dhcpd: DHCPACK on IP to MAC via eth2

如何使用 grok 来使用两个不同的匹配项? 我有 dhcpack 这两个匹配项,但只使用第一个:

((%{SYSLOGTIMESTAMP:timestamp})\s*(%{HOSTNAME:hostname})\sdhcpd\S+\s(%{WORD:dhcp_action})?.[for|on] (%{IPV4:dhcp_client_ip})?.[from|to] (%{COMMONMAC:dhcp_client_mac})?.*via (%{USERNAME:interface}))

((%{SYSLOGTIMESTAMP:timestamp})\s*(%{HOSTNAME:hostname})\sdhcpd\S+\s(%{WORD:dhcp_action})?.*[to] (%{IPV4:dhcp_client_ip})?.*via (%{USERNAME:interface}))

有人可以帮忙吗?

我建议先把常见的东西(直到冒号)去掉,然后用更具体的模式处理更具体的东西。一些细节 here.

the doc所示,grok{}可以采用多种模式:

filter {
  grok { match => { "message" => [
     "Duration: %{NUMBER:duration}",
     "Speed: %{NUMBER:speed}"
  ] } }
}

默认情况下,它会在第一次匹配后停止处理,但这是可以配置的。

编辑:

根据您的其他评论,您还可以根据条件进行分支:

if [myField] == "someValue" {
    grok {
        ...
    }
}
else {
    grok {
        ...
    }
}

在这种情况下,您正在 运行 比较 ("==") 或正则表达式 ("=~") 以查看您是否应该 运行 正则表达式 (grok{} ).根据完整的业务逻辑,这似乎是一种浪费。

我想做类似的事情:

In ((%{SYSLOGTIMESTAMP:timestamp})\s*(%{HOSTNAME:hostname})\sdhcpd\S+\s(%{WORD:dhcp_action})?.[for|on] (%{IPV4:dhcp_client_ip})?.[from|to] (%{COMMONMAC:dhcp_client_mac})?.*via (%{USERNAME:interface})) 

只获取 dhcp_action 并使用 if 语句,例如:

 if (mCursor != null && mCursor.moveToFirst()) {
         ......
 } else {
         ......
 }

可能吗?

我用这个解决问题:

filter { grok { match => ["message", "(dhcpd\S+\s*(%{WORD:dhcp_action_test}))"] } if "DHCPINFORM" in [message] { grok { match => ["message","((%{SYSLOGTIMESTAMP:timestamp})\s* (%{HOSTNAME:hostname})\sdhcpd\S+\s(%{WORD:dhcp_action})?.[from] (%{IPV4:dhcp_client_ip}))"] } } else if "DHCPDISCOVER" in [message] { grok { match => ["message","((%{SYSLOGTIMESTAMP:timestamp})\s(%{HOSTNAME:hostname})\sdhcpd\S+\s(%{WORD:dhcp_action})?.*[from] (%{COMMONMAC:dhcp_client_mac})"] } } else { drop {} }

}