2016-12-29 12 views
1

logstashでjavaクラスを呼び出すカスタムフィルタプラグインを作成しました。Logstashカスタム入力プラグインを使用して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クラスをインスタンス化することができますか?キューから読み込んだすべてのメッセージについて、Javaクラスの新しいインスタンスを作成するのではなく、ログスタートの起動時にインスタンス化し、すべての受信メッセージに対して同じオブジェクトを使用します。

答えて

1

はい。それはかなり簡単です。 Rubyクラスにインスタンス変数を作成してJavaオブジェクトを保持し、Rubyクラスのメソッドregisterでインスタンス変数をインスタンス化することができます。フィルタメソッドでは、インスタンス変数を使用して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でインスタンス変数にするために、変数名の前に@を使用することを忘れないでください。

+0

ありがとう。あなたは私の一日を救った! – minion

1

代わりに、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

関連する問題