如何区分类似日志的 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 {}
}
}
我有这样的日志用于 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 {} }
}