我正在寻找一种使用Logstash从系统日志条目中解析IP地址和MAC的方法。目前,我尝试使用GROK来获取它,但是问题是,我可能必须匹配整行,而不仅仅是消息本身的一部分。
例如,我必须遵循以下行:
4月9日12:41:01 cn1Label =主机ID dvchost = exch01 TrendMicroDsTenant =主要 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 =碎片位proto = ICMP srcPort = 0 dstPort = 0 cnt = 1 act = IDS:Reset cn3 = 0 cn3Label = DPI数据包 位置cs5 = 0 cs5Label = DPI流位置cs6 = 0 cs6Label = DPI标志
我想获取“ 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而不解析整行?
我会尝试解析消息的其他部分,例如协议。我之所以不匹配实线,是因为某些消息不同,因此还需要另一种提取其值的方法。
谢谢!
答案 0 :(得分:2)
您可以使用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过滤器不同,您不必依赖成对的顺序保持不变。
答案 1 :(得分:0)
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
答案 2 :(得分:0)
我刚刚找到了解决方案。我做错了什么您必须分别为每个匹配项做一个匹配过滤器。如果这样做,我也可以提取消息字段中的内容,例如:
grok{match => {"message" => "SRC=%{IPV4:ip}"}}