logstash grok从hostname和igone ip中删除fqdn

时间:2015-06-07 09:14:43

标签: json logstash grok logstash-grok

我的logstash输入接收看起来像这样的jsons:

{"src":"comp1.google.com","dst":"comp2.yehoo.com","next_hope":"router4.ccc.com"}

并且json看起来像这样(某些键可以保存ip而不是主机名:

{"src":"comp1.google.com","dst":"192.168.1.20","next_hope":"router4.ccc.com"}

我想删除fqdn,如果它包含ip(忽略它),请将其保留为ip

我尝试了这个,但它不起作用

filter {
   grok  {
           match => {
               "src" => "%{IP:src}"
               "src" => "%{WORD:src}"
           }
           overwrite => ["src"]
           break_on_match => true
         }
    grok  {
           match => {
               "dst" => "%{IP:dst}"
               "dst" => "%{WORD:dst}"
           }
           overwrite => ["dst"]
           break_on_match => true
         }
     grok  {
           match => {
               "next_hope" => "%{IP:next_hope}"
               "next_hope" => "%{WORD:next_hope}"
           }
           overwrite => ["next_hope"]
           break_on_match => true
         }
}

这个过滤器在第一个json上运行良好。 但这不适用于第二个json(dst键)  我得到了这个结果:

{
   "src" => "comp1",
   "dst" => "192", 
   "next_hope" => "router4"
}

我希望dst字段保留原始值,因为他有ip地址而不是主机名。

我期望的结果是:

    {
      "src" => "comp1",
       "dst" => "192.168.1.20", 
       "next_hope" => "router4"
     }

任何想法? 也有可能在1 grok过滤器中完成所有这些技巧吗?

1 个答案:

答案 0 :(得分:0)

你的问题是WORD的正则表达式匹配一个数字。最简单的方法是保护grok,使它们不运行IP地址:

if [src] !~ /\d+\.\d+\.\d+\.\d+/ {
   grok  {
       match => {
           "src" => "%{WORD:src}"
       }
       overwrite => ["src"]
     }     
}

对其他领域重复一遍。