如何在logstash中的ruby过滤器中调用另一个过滤器。

时间:2016-07-13 22:26:32

标签: logstash logstash-configuration

我正在构建logstash,并希望构建功能来匿名化消息中指定的字段。

根据以下消息,字段fta是要匿名化的字段列表。我想使用%{fta}并将其传递给匿名过滤器,但这似乎不起作用。

{  "containsPII":"True",  "fta":["f1","f2"],  "f1":"test",  "f2":"5551212" }

我的配置如下

 input {
  stdin { codec => json }
}

filter {
  if [containsPII] {
    anonymize {
      algorithm => "SHA1"
      key => "123456789"
      fields => %{fta}
    }
  }
}

output {
  stdout {
    codec => rubydebug
  }
}

输出

{
    "containsPII" => "True",
            "fta" => [
        [0] "f1",
        [1] "f2"
    ],
             "f1" => "test",
             "f2" => "5551212",
       "@version" => "1",
     "@timestamp" => "2016-07-13T22:07:04.036Z",
           "host" => "..."
}

有没有人有任何想法?我在这一点上尝试了几种排列而没有运气。

谢谢, -D

编辑: 在Elastic论坛上发帖后,我发现使用基本logstash功能是不可能的。我会尝试使用红宝石过滤器。那么,为了修改我的问题,如何在ruby过滤器中调用另一个过滤器?我尝试了以下没有运气,老实说,甚至不知道在哪里看。我对红宝石很新。

filter {
 if [containsPII] {
    ruby {
      code => "event['fta'].each { |item| event[item] = LogStash::Filters::Anonymize.execute(event[item],'12345','SHA1') }"
      add_tag => ["Rubyrun"]
    }
 }
}

2 个答案:

答案 0 :(得分:0)

好吧,我无法弄清楚如何从红宝石过滤器中调用另一个过滤器,但我确实达到了功能目标。

filter {
 if [fta] {
    ruby {
      init => "require 'openssl'"
      code => "event['fta'].each { |item| event[item] = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA256.new, '123456789', event[item] ) }"
    }
 }
}

如果字段FTA存在,它将对该数组中列出的每个字段进行SHA2编码。

答案 1 :(得分:0)

您可以从ruby脚本执行过滤器。步骤将是:

  • 在内联ruby脚本的init块中创建所需的过滤器实例。
  • 对于每个事件,请调用过滤器实例的过滤方法。
  • 以下是上述问题陈述的示例。它将使用SHA1替换事件中的my_ip字段。
  • 使用ruby脚本文件可以实现相同。
  • 以下是示例配置文件。

    input { stdin { codec => json_lines } }
    filter {
      ruby {
        init => "
          require 'logstash/filters/anonymize'
    
          # Create instance of filter with applicable parameters
          @anonymize = LogStash::Filters::Anonymize.new({'algorithm' => 'SHA1', 
                                                         'key' => '123456789', 
                                                         'fields' => ['my_ip']})
          # Make sure to call register
          @anonymize.register                                                  
        "
        code => "
          # Invoke the filter
          @anonymize.filter(event)
        "
      }
    }
    output { stdout { codec => rubydebug {metadata => true} } }