我有dhcpack
的日志类型:
Jun 30 06:34:18 HOSTNAME dhcpd:通过eth2将DHCPACK转换为IP(MAC)
Jun 30 06:34:28 HOSTNAME dhcpd:通过eth2在IP到MAC上的DHCPACK
如何使用grok
来使用两种不同的匹配?
我有dhcpack
的这两个匹配项,但只使用第一个:
((%{SYSLOGTIMESTAMP:时间戳})\ S *(%{主机名:主机名})\ S 的dhcpd \ S + \ S (%{WORD:dhcp_action}?)。 [为|上] ?(%{IPV4:dhcp_client_ip}) [从|至] (%{COMMONMAC:dhcp_client_mac})?。* via(%{USERNAME:interface}))
((%{SYSLOGTIMESTAMP:时间戳})\ S *(%{主机名:主机名})\ S 的dhcpd \ S + \ S (%{WORD:dhcp_action}?)。* [给] (%{IPV4:dhcp_client_ip})?。* via(%{USERNAME:interface}))
有人可以帮忙吗?
答案 0 :(得分:0)
我建议首先关闭常见的东西(直到冒号)然后用更具体的模式处理更具体的东西。一些细节here。
如the doc所示,grok {}可以采用多种模式:
filter {
grok { match => { "message" => [
"Duration: %{NUMBER:duration}",
"Speed: %{NUMBER:speed}"
] } }
}
默认情况下,它会在第一次匹配后停止处理,但这是可配置的。
编辑:
根据您的其他评论,您还可以根据条件进行分支:
if [myField] == "someValue" {
grok {
...
}
}
else {
grok {
...
}
}
在这种情况下,您正在运行比较(“==”)或regexp(“=〜”)以查看是否应运行regexp(grok {})。根据完整的业务逻辑,这似乎是一种浪费。
答案 1 :(得分:0)
我想做类似的事情:
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 {
......
}
可能吗?
答案 2 :(得分:0)
我解决了这个问题:
过滤器 { 神交 { match => [“message”,“(dhcpd \ S + \ s *(%{WORD:dhcp_action_test}))”] } 如果[消息]中有“DHCPINFORM” { 神交 { match => [“message”,“((%{SYSLOGTIMESTAMP:timestamp})\ s *(%{HOSTNAME:hostname})\ s dhcpd \ S + \ s (%{WORD:dhcp_action})? [from](%{IPV4:dhcp_client_ip}))“] } } 否则如果[消息]中的“DHCPDISCOVER” { 神交 { match => [ “消息”,“((%{SYSLOGTIMESTAMP:时间戳})\ S (%{主机名:主机名})\ S 的dhcpd \ S + \ S (%{WORD:dhcp_action} )?。* [from](%{COMMONMAC:dhcp_client_mac})“] } } 其他 { 丢弃{} }
}