Logstash 如何区分相似日志的grok筛选器

Logstash 如何区分相似日志的grok筛选器,logstash,logstash-grok,Logstash,Logstash Grok,我有这类日志用于dhcpack: Jun 30 06:34:18主机名dhcpd:DHCPACK通过eth2连接到IP(MAC) Jun 30 06:34:28主机名dhcpd:DHCPACK在IP上通过eth2连接到MAC 如何使用grok,使用两个不同的匹配项? 对于dhcpack,我有两个匹配项,但只使用第一个: ((({SYSLOGTIMESTAMP:timestamp})\s*({HOSTNAME:HOSTNAME})\sdhcpd\s+\s(%{WORD:dhcp\u action}

我有这类日志用于
dhcpack

Jun 30 06:34:18主机名dhcpd:DHCPACK通过eth2连接到IP(MAC)

Jun 30 06:34:28主机名dhcpd:DHCPACK在IP上通过eth2连接到MAC

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

((({SYSLOGTIMESTAMP:timestamp})\s*({HOSTNAME:HOSTNAME})\sdhcpd\s+\s(%{WORD:dhcp\u action})?。[用于| on] ({IPV4:dhcp_客户端_ip})?[从|到] ({COMMONMAC:dhcp_client_mac})?*via(%%{USERNAME:interface}))

((({SYSLOGTIMESTAMP:timestamp})\s*({HOSTNAME:HOSTNAME})\sdhcpd\s+\s(%{WORD:dhcp\u action})?..[to] ({IPV4:dhcp_客户端_ip})?*via(%%{USERNAME:interface}))


有人可以帮忙吗?

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

如中所示,grok{}可以采用多种模式:

filter {
  grok { match => { "message" => [
     "Duration: %{NUMBER:duration}",
     "Speed: %{NUMBER:speed}"
  ] } }
}
默认情况下,它将在第一次匹配后停止处理,但这是可配置的

编辑:

根据其他注释,您还可以根据条件进行分支:

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

在本例中,您正在运行比较(“==”)或regexp(“=~”),以查看是否应该运行regexp(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\u操作并使用if语句,如:

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

有可能吗?

我用以下方法解决问题:

滤器 { 格罗克 { match=>[“message”,“(dhcpd\S+\S*({WORD:dhcp\u action\u test}))”] } 如果[消息]中有“DHCPINFORM” { 格罗克 { match=>[“message”,“((((({SYSLOGTIMESTAMP:timestamp})\s*(({HOSTNAME:HOSTNAME})\sdhcpd\s+\s(%{WORD:dhcp\u action})]。[来自](({IPV4:dhcp\u client\u ip})]” } } 如果[消息]中的“DHCPDISCOVER”,则为 { 格罗克 { match=>[“message”,“(((({SYSLOGTIMESTAMP:timestamp})\s(%{HOSTNAME:HOSTNAME})\sdhcpd\s+\s(%{WORD:dhcp\u action})。..[来自]({COMMONMAC:dhcp\u client\u mac})]] } } 其他的 { 删除{} }

}


我想做一些像这样的事情:if(dhcp\u action==“dhcpinfo”){((({SYSLOGTIMESTAMP:timestamp})\s*({HOSTNAME:HOSTNAME})\sdhcpd\s+\s(%%{WORD:dhcp\u action}).[for | on]({IPV4:dhcp\u client\u ip}).[从|到({COMMONMAC dhcp\u client\u mac}).*通过(%{USERNAME:interface})其他{(({SYSLOGTIMESTAMP:timestamp})s*({HOSTNAME:HOSTNAME})\sdhcpd\s+\s(%%{WORD:dhcp\u action})..[to]({IPV4:dhcp\u client\u ip}).*通过(%%{USERNAME:interface}))}这是可能的吗?是的,您可以使用条件,尽管您可能不想使用。我已经更新了我的原始答案。