ELK-Stack:使用Logstash仅解析Syslog中的IP / MAC

时间:2019-04-10 18:27:28

标签: elasticsearch logstash logstash-grok logstash-configuration

我正在寻找一种使用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而不解析整行?

我会尝试解析消息的其他部分,例如协议。我之所以不匹配实线,是因为某些消息不同,因此还需要另一种提取其值的方法。

谢谢!

3 个答案:

答案 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}"}}