【问题标题】:Logstash custom input plugin to call java classLogstash自定义输入插件调用java类
【发布时间】:2016-12-29 09:36:54
【问题描述】:

我为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 启动期间对其进行实例化,并对所有传入消息使用相同的对象。

【问题讨论】:

    标签: java ruby apache-kafka logstash logstash-configuration


    【解决方案1】:

    是的。这样做很容易。您可以在 ruby​​ 类中创建一个实例变量来保存 Java 对象并在 ruby​​ 类的 register 方法中实例化它。在filter方法中,使用实例变量来访问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中的实例变量。

    【讨论】:

    • 谢谢。你拯救了我的一天!
    【解决方案2】:

    另一种方法是使用 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) Singleton Pattern

    2) Ruby Singleton class documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 2017-08-06
      • 2016-08-19
      • 1970-01-01
      • 2015-10-29
      相关资源
      最近更新 更多