logstash自定义输入插件,用于调用java类

9bfwbjaz  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(447)

我已经为logstash编写了一个定制的过滤器插件来调用java类。
要求:
输入插件:从队列读取
自定义插件:为队列中的每条消息调用java类


**Code:**

# encoding: utf-8

require "logstash/filters/base"
require "logstash/namespace"
require "java"
require "test.jar"

class LogStash::Filters::Example < LogStash::Filters::Base

  config_name "example"

  public
  def register
  end # def register

  public
  def filter(event)
      object = Java::Com.test.Test.new
      a = object.readMessage(event.get("message"))
      event.set("message",a)

    filter_matched(event)
  end # def filter

end # class LogStash::Filters::Example

问题:有没有一种方法可以只示例化java类一次?对于从队列中读取的每条消息,我不想创建java类的新示例,而是在logstash启动期间示例化它,并对所有传入消息使用相同的对象。

u3r8eeie

u3r8eeie1#

对。这很容易做到。您可以在ruby类中创建一个示例变量来保存java对象,并在 register ruby类的方法。在filter方法中,使用instance变量访问java对象。
下面的代码应该适合你。


# encoding: utf-8

require "logstash/filters/base"
require "logstash/namespace"
require "java"
require "test.jar"

class LogStash::Filters::Example < LogStash::Filters::Base

  config_name "example"

  public
  def register
    @object = Java::Com.test.Test.new
  end # def register

  public
  def filter(event)
      a = @object.readMessage(event.get("message"))
      event.set("message",a)
    filter_matched(event)
  end # def filter
end # class LogStash::Filters::Example

记住使用 @ 在变量名之前,使其成为ruby中的示例变量。

6l7fqoea

6l7fqoea2#

另一种选择是使用ruby singleton类;

require 'singleton'

class Logger
  include Singleton

  def initialize
    @log = File.open("log.txt", "a")
  end

  def log(msg)
    @log.puts(msg)
  end
end

Logger.instance.log('message 2')

您可以在initialize方法中执行所需的操作,然后只调用类的所有示例来重复调用它,而不必每次都初始化它。
更多信息请访问:
1) 单子模式
2) ruby单例类文档

相关问题