ELK-Stack:使用 Logstash 从 Syslog 中仅解析 IP/MAC
ELK-Stack: Parse only IP/MAC from Syslog with Logstash
我正在寻找一种方法来使用 Logstash 从 syslog 条目中解析 IP 地址和 MAC。目前我尝试使用 GROK 获取它,但问题是,我可能必须匹配整行,而不仅仅是消息本身的一部分。
例如,我必须遵循以下行:
Apr 9 12:41:01 cn1Label=Host ID dvchost=exch01 TrendMicroDsTenant=Primary
TrendMicroDsTenantId=0 dstMAC=55:C0:A8:55:FF:41
srcMAC=CA:36:42:B1:78:3D TrendMicroDsFrameType=IP src=10.0.251.84
dst=56.19.41.128 out=166 cs3= cs3Label=Fragmentation Bits proto=ICMP
srcPort=0 dstPort=0 cnt=1 act=IDS:Reset cn3=0 cn3Label=DPI Packet
Position cs5=0 cs5Label=DPI Stream Position cs6=0 cs6Label=DPI Flags
我想获取 "src" 和 "dst" IP 以及 "srcMAC" 和 "dstMAC"。我会在 Logstash 中这样尝试:
grok{
match => { "message" => "src=%{IPV4:src_ip}" }
match => { "message" => "dst=%{IPV4:dst_ip}" }
match => { "message" => "srcMAC=%{MAC:src_mac}" }
match => { "message" => "dstMAC=%{MAC:dst_mac}" }
}
但是不行,因为它没有匹配整行。我也尝试了 .*
和其他匹配技术,但没有成功。
有没有办法只解析所示的 IP 而无需解析整行?
我会尝试解析消息的其他部分,例如协议。我不匹配整行的原因是,有些消息是不同的,因此还需要另一种方法来提取其值。
谢谢!
grok
过滤器需要匹配整个消息,要仅获取几个字段,您仍然需要匹配所有内容,以下模式将匹配您的示例。
%{GREEDYDATA}%{SPACE}dstMAC=%{MAC:dst_mac}%{SPACE}srcMAC=%{MAC:src_mac}%{SPACE}%{GREEDYDATA}%{SPACE}src=%{IP:src_ip}%{SPACE}dst=%{IP:dst_ip}%{SPACE}%{GREEDYDATA}
结果将是:
{
"src_ip": "10.0.251.84",
"src_mac": "CA:36:42:B1:78:3D",
"dst_mac": "55:C0:A8:55:FF:41",
"dst_ip": "56.19.41.128"
}
此模式还将匹配具有以下格式的任何消息:
ANYTHING dstMAC=MACADDRESS srcMAC=MACADDRESS ANYTHING src=IPADDRESS dst=IPADRESS ANYTHING
您可以使用 kv filter 来处理键值对,就像您在日志中的键值对一样。要仅保留相关对,请使用 include_keys
选项。
在你的情况下,它看起来像这样:
kv{
include_keys => [ "src", "dst", "srcMAC", "dstMAC" ]
}
这将导致:
{
"dst": "56.19.41.128",
"host": "frsred-0077",
"srcMAC": "CA:36:42:B1:78:3D",
"dstMAC": "55:C0:A8:55:FF:41"
}
kv 过滤器的一个好处是您不依赖于保持相同的对的顺序,这与 grok 过滤器不同。
我刚刚找到了解决方案。我做错了事。您必须分别为每个匹配做一个匹配过滤器。如果我这样做,那么我还可以提取消息字段中的内容,例如:
grok{match => {"message" => "SRC=%{IPV4:ip}"}}
我正在寻找一种方法来使用 Logstash 从 syslog 条目中解析 IP 地址和 MAC。目前我尝试使用 GROK 获取它,但问题是,我可能必须匹配整行,而不仅仅是消息本身的一部分。
例如,我必须遵循以下行:
Apr 9 12:41:01 cn1Label=Host ID dvchost=exch01 TrendMicroDsTenant=Primary TrendMicroDsTenantId=0 dstMAC=55:C0:A8:55:FF:41 srcMAC=CA:36:42:B1:78:3D TrendMicroDsFrameType=IP src=10.0.251.84 dst=56.19.41.128 out=166 cs3= cs3Label=Fragmentation Bits proto=ICMP srcPort=0 dstPort=0 cnt=1 act=IDS:Reset cn3=0 cn3Label=DPI Packet Position cs5=0 cs5Label=DPI Stream Position cs6=0 cs6Label=DPI Flags
我想获取 "src" 和 "dst" IP 以及 "srcMAC" 和 "dstMAC"。我会在 Logstash 中这样尝试:
grok{
match => { "message" => "src=%{IPV4:src_ip}" }
match => { "message" => "dst=%{IPV4:dst_ip}" }
match => { "message" => "srcMAC=%{MAC:src_mac}" }
match => { "message" => "dstMAC=%{MAC:dst_mac}" }
}
但是不行,因为它没有匹配整行。我也尝试了 .*
和其他匹配技术,但没有成功。
有没有办法只解析所示的 IP 而无需解析整行?
我会尝试解析消息的其他部分,例如协议。我不匹配整行的原因是,有些消息是不同的,因此还需要另一种方法来提取其值。
谢谢!
grok
过滤器需要匹配整个消息,要仅获取几个字段,您仍然需要匹配所有内容,以下模式将匹配您的示例。
%{GREEDYDATA}%{SPACE}dstMAC=%{MAC:dst_mac}%{SPACE}srcMAC=%{MAC:src_mac}%{SPACE}%{GREEDYDATA}%{SPACE}src=%{IP:src_ip}%{SPACE}dst=%{IP:dst_ip}%{SPACE}%{GREEDYDATA}
结果将是:
{
"src_ip": "10.0.251.84",
"src_mac": "CA:36:42:B1:78:3D",
"dst_mac": "55:C0:A8:55:FF:41",
"dst_ip": "56.19.41.128"
}
此模式还将匹配具有以下格式的任何消息:
ANYTHING dstMAC=MACADDRESS srcMAC=MACADDRESS ANYTHING src=IPADDRESS dst=IPADRESS ANYTHING
您可以使用 kv filter 来处理键值对,就像您在日志中的键值对一样。要仅保留相关对,请使用 include_keys
选项。
在你的情况下,它看起来像这样:
kv{
include_keys => [ "src", "dst", "srcMAC", "dstMAC" ]
}
这将导致:
{
"dst": "56.19.41.128",
"host": "frsred-0077",
"srcMAC": "CA:36:42:B1:78:3D",
"dstMAC": "55:C0:A8:55:FF:41"
}
kv 过滤器的一个好处是您不依赖于保持相同的对的顺序,这与 grok 过滤器不同。
我刚刚找到了解决方案。我做错了事。您必须分别为每个匹配做一个匹配过滤器。如果我这样做,那么我还可以提取消息字段中的内容,例如:
grok{match => {"message" => "SRC=%{IPV4:ip}"}}