编写Logstash GEM会出现错误:未定义的局部变量或方法 [英] Writing a Logstash GEM gives an error: undefined local variable or method
问题描述
试图构建一个宝石,以将其用于Logstash作为过滤器.我正在使用.jar文件中的类和方法.
Trying to build a gem to use it for Logstash as a filter. I'm using classes and methods from a .jar file.
以下是我到目前为止的Jruby代码:
The following is my Jruby code so far:
# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"
require 'java'
require 'Processing.jar'
java_import 'process.Process'
class LogStash::Filters::Process < LogStash::Filters::Base
config_name "process"
StringPath = "/path/to/file/"
ML = JavaUtilities.get_proxy_class('processing.Processing')
@ML = ML.new(StringPath)
public
def register
end
public
def filter(event)
event["result"] = @ML.Process("any string.")
filter_matched(event)
end
end
但是,它给了我以下错误:
However, it gave me the following error:
←[31mException in filterworker, the pipeline stopped processing new events, plea
se check your filter configuration and restart Logstash. {"exception"=>#<NoMetho
dError: undefined method 'Process' for nil:NilClass>, "backtrace"=>[
"/path/to/logstash-2.0.0/vendor/local_gems
/dda91dc0/logstash-filter-Process-0.5.0/lib/logstash/filters/processing.rb:54:in 'filter'", "/path/to/log
stash-2.0.0/vendor/bundle/jruby/1.9/gems/logstash-core-2.0.0-java/lib/logstash/f
ilters/base.rb:152:in 'multi_filter'", "org/jruby/RubyArray.java:1613:in 'each'"
, "/path/to/logstash-2.0.0/vendor/bundle/j
ruby/1.9/gems/logstash-core-2.0.0-java/lib/logstash/filters/base.rb:149:in 'mult
i_filter'", "(eval):233:in 'filter_func'", "/path/to/logstash-2.0.0/vendor/bundle/jruby/1.9/gems/logstash-core-2.0.0-java/
lib/logstash/pipeline.rb:219:in 'filterworker'", "path/to/log/logstash-2.0.0/vendor/bundle/jruby/1.9/gems/logstash-core-2.0.0
-java/lib/logstash/pipeline.rb:154:in 'start_filters'"], :level=>:error}←[0m
NoMethodError: undefined method 'Process' for nil:NilClass
filter at /path/to/logstash-2.0.0
/vendor/local_gems/dda91dc0/logstash-filter-Process-0.5.0/lib/logstash
/filters/Process.rb:54
multi_filter at /path/to/logstash-2.0.0
/vendor/bundle/jruby/1.9/gems/logstash-core-2.0.0-java/lib/logstash/filters/base
.rb:152
each at org/jruby/RubyArray.java:1613
multi_filter at /path/to/logstash-2.0.0
/vendor/bundle/jruby/1.9/gems/logstash-core-2.0.0-java/lib/logstash/filters/base
.rb:149
filter_func at (eval):233
filterworker at /path/to/logstash-2.0.0
/vendor/bundle/jruby/1.9/gems/logstash-core-2.0.0-java/lib/logstash/pipeline.rb:
219
start_filters at /path/to/logstash-2.0.0
/vendor/bundle/jruby/1.9/gems/logstash-core-2.0.0-java/lib/logstash/pipeline.rb:
154
我尝试了以下操作:
.
.
.
public
def filter(event)
StringPath = "/path/to/file/"
ML = JavaUtilities.get_proxy_class('processing.Processing')
@ML = ML.new(StringPath)
event["result"] = @ML.Process("any string.")
filter_matched(event)
end
end
但是它给了我错误:
SyntaxError: dynamic constant assignment error.
我在普通的jruby文件中尝试了此操作,并且一切正常.但是,使用Logstash的filter
似乎给我一个问题.
I tried this in a normal jruby file and everything worked with me. Using Logstash's filter
however is what seems to be giving me an issue here.
推荐答案
似乎您在Ruby中遇到了 local 和 instance 变量的问题.有关更多信息,请参见此博客文章.
It seems you are struggling with local and instance variables in Ruby. Please see this blog post for more information.
当您调用event["result"] = ML.Process(event["text"])
时,ruby尝试查找名为ML
的局部变量,该变量不存在.因此,您得到undefined local variable or method ML.Process(event["text"])
.因此,弄乱您的变量可能会解决您的问题.
When you call event["result"] = ML.Process(event["text"])
ruby tries to find a local variable named ML
which doesn't exist. Therefore you get undefined local variable or method ML.Process(event["text"])
. So, messing around with your variables might solve your problem.
@ML
是一个实例变量,并且在所有使用@ML
或self.ML
调用它的方法中都可用.请尝试以下方法:
@ML
is an instance variable and is available in all methods calling it using @ML
or self.ML
. Please try this:
public
def filter(event)
event["result"] = @ML.Process(event["text"])
filter_matched(event)
end
我偶然发现的事情:
-
MLVectorPath
和MLStopWordPath
来自哪里? - 什么是
StringPath
?已分配但从未使用过. - 您是否有字段
text
?否则,将event["text"]
更改为event["message"]
.
- Where do
MLVectorPath
andMLStopWordPath
come from? - What is
StringPath
? It is assigned but never used. - Do you have a field
text
? Otherwise changeevent["text"]
intoevent["message"]
.
但是,我既不知道您的Java代码也不知道您的logstash配置,所以这些事情可能还不错.请告诉我是否有帮助.
However, I know neither your Java code nor your logstash configuration so these things may be okay. Please let me know if this helps.
这篇关于编写Logstash GEM会出现错误:未定义的局部变量或方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!