编写Logstash GEM会出现错误:未定义的局部变量或方法

尝试构建一个gem,将其用作Logstash作为filter。 我正在使用.jar文件中的类和方法。

以下是我目前的Jruby代码:

# 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 

但是,它给了我以下错误:

  ←[31mException in filterworker, the pipeline stopped processing new events, plea se check your filter configuration and restart Logstash. {"exception"=>#, "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似乎在这里给我一个问题。

看来你正在努力使用Ruby中的本地变量和实例变量。 有关更多信息,请参阅此博客文章 。

当你调用event["result"] = ML.Process(event["text"]) ruby试图找到一个名为ML的本地变量,该变量不存在。 因此,您获得undefined local variable or method ML.Process(event["text"]) 。 因此,搞乱你的变量可能会解决你的问题。

@ML是一个实例变量,可以在使用@MLself.ML调用它的所有方法中使用。 请试试这个:

 public def filter(event) event["result"] = @ML.Process(event["text"]) filter_matched(event) end 

我偶然发现的事情:

  • MLVectorPathMLStopWordPath来自哪里?
  • 什么是StringPath ? 它已分配但从未使用过。
  • 你有现场text吗? 否则将event["text"]更改为event["message"]

但是,我既不知道您的Java代码也不知道您的logstash配置,所以这些东西可能没问题。 请让我知道这可不可以帮你。