elasticsearch ELK堆栈:使用Logstash从Syslog仅解析IP/MAC,elasticsearch,logstash,logstash-grok,logstash-configuration,elasticsearch,Logstash,Logstash Grok,Logstash Configuration" /> elasticsearch ELK堆栈:使用Logstash从Syslog仅解析IP/MAC,elasticsearch,logstash,logstash-grok,logstash-configuration,elasticsearch,Logstash,Logstash Grok,Logstash Configuration" />

elasticsearch ELK堆栈:使用Logstash从Syslog仅解析IP/MAC

elasticsearch ELK堆栈:使用Logstash从Syslog仅解析IP/MAC,elasticsearch,logstash,logstash-grok,logstash-configuration,elasticsearch,Logstash,Logstash Grok,Logstash Configuration,我正在寻找一种方法,用Logstash从syslog条目解析IP地址和mac。目前,我尝试使用GROK获取它,但问题是,我可能必须匹配整行,而不仅仅是消息本身的一部分 例如,我必须执行以下命令: 4月9日12:41:01 cn1Label=主机ID dvchost=exch01 TrendMicrodTenant=主 TrendMicroDsTenantId=0 dstMAC=55:C0:A8:55:FF:41 srcMAC=CA:36:42:B1:78:3D TrendMicroDsFrame

我正在寻找一种方法,用Logstash从syslog条目解析IP地址和mac。目前,我尝试使用GROK获取它,但问题是,我可能必须匹配整行,而不仅仅是消息本身的一部分

例如,我必须执行以下命令:

4月9日12:41:01 cn1Label=主机ID dvchost=exch01 TrendMicrodTenant=主 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数据包 位置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而不解析整行

我会尝试解析消息的其他部分,比如协议。我不匹配整行的原因是,某些消息不同,因此还需要另一种方法来提取其值


谢谢大家!

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

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
您可以使用来处理与日志中的键值对类似的键值对。要仅保留相关对,请使用
include_key
选项

在您的情况下,它将如下所示:

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过滤器不同,您不需要依赖于保持不变的对顺序。

您可以使用来处理日志中的键值对。要仅保留相关对,请使用
include_key
选项

在您的情况下,它将如下所示:

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

我刚刚找到了解决办法。我做错了一件事。您必须为每个匹配分别执行匹配筛选器。如果我这样做,那么我还可以提取消息字段中的内容,例如:

grok{match => {"message" => "SRC=%{IPV4:ip}"}}

当在单个grok过滤器中使用多个模式时,logstash将尝试逐个匹配每个模式,在第一次成功匹配时停止,这解释了为什么它在您的情况下不起作用。但您可以有多个grok过滤器,每个过滤器都有不同的模式。@谢谢。我也发现了失败。谢谢你提到这个!当在单个grok过滤器中使用多个模式时,logstash将尝试逐个匹配每个模式,在第一次成功匹配时停止,这解释了为什么它在您的情况下不起作用。但您可以有多个grok过滤器,每个过滤器都有不同的模式。@谢谢。我也发现了失败。谢谢你提到这个!它不需要匹配整个消息,就像我上一次回答中提到的。它不需要匹配整个消息,就像我上一次回答中提到的。实际上我从未使用过kv滤波器,但我会尝试。非常感谢。(:事实上我从来没有用过kv滤波器,但我要试试。谢谢!(-):