【问题标题】:ELK-Stack: Parse only IP/MAC from Syslog with LogstashELK-Stack:使用 Logstash 仅解析来自 Syslog 的 IP/MAC
【发布时间】:2019-04-10 18:27:28
【问题描述】:

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

例如,我必须遵循以下行:

4 月 9 日 12:41:01 cn1Label=主机 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=分段位 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 过滤器中使用多个模式时,logstash 将尝试一个接一个地匹配每个模式,在第一个成功匹配时停止,这解释了为什么它在您的情况下不起作用。但是您可以拥有多个 grok 过滤器,每个过滤器都有不同的模式。
  • @baudsp 谢谢。我也发现了失败。谢谢你提到这一点!

标签: elasticsearch logstash logstash-grok logstash-configuration


【解决方案1】:

您可以使用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"
}

与 grok 过滤器不同,kv 过滤器的一个好处是您不依赖于保持不变的对的顺序。

【讨论】:

  • 其实我没用过kv滤镜,不过我会试试的。谢谢! (-:
【解决方案2】:

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

【讨论】:

  • 不需要匹配整个消息,就像我上一个回答中提到的那样。
【解决方案3】:

我刚刚找到了解决方案。我做了一件非常错误的事情。您必须分别为每个匹配项进行匹配过滤器。如果这样做,那么我还可以提取消息字段中的内容,例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多