我已经为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启动期间实例化它,并对所有传入消息使用相同的对象。
发布于 2016-12-29 16:34:14
是。做那件事很容易。您可以在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中的实例变量。
发布于 2017-04-10 22:18:50
https://stackoverflow.com/questions/41376870
复制相似问题