调用 Logstash 自定义输入插件 java class
Logstash custom input plugin to call java class
我已经为 logstash 编写了一个自定义过滤器插件来调用 java class。
要求:
输入插件:从队列中读取
自定义插件:对于队列中的每条消息调用 java class
**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 class 一次?对于我从队列中读取的每条消息,我不想创建 java class 的新实例,而是在 logstash 启动期间实例化它并为所有传入消息使用相同的对象。
是的。这很容易做到。您可以在 ruby class 中创建一个实例变量来保存 Java 对象并在 ruby class 的 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中的实例变量。
另一种方法是使用 Ruby 单例 class;
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方法中做你需要的,然后只是你class的所有实例重复调用它而不是每次都初始化它。
更多信息可在:
我已经为 logstash 编写了一个自定义过滤器插件来调用 java class。
要求:
输入插件:从队列中读取
自定义插件:对于队列中的每条消息调用 java class
**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 class 一次?对于我从队列中读取的每条消息,我不想创建 java class 的新实例,而是在 logstash 启动期间实例化它并为所有传入消息使用相同的对象。
是的。这很容易做到。您可以在 ruby class 中创建一个实例变量来保存 Java 对象并在 ruby class 的 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中的实例变量。
另一种方法是使用 Ruby 单例 class;
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方法中做你需要的,然后只是你class的所有实例重复调用它而不是每次都初始化它。
更多信息可在: