编写Logstash GEM会出现错误:未定义的局部变量或方法 [英] Writing a Logstash GEM gives an error: undefined local variable or method

查看:229
本文介绍了编写Logstash GEM会出现错误:未定义的局部变量或方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

试图构建一个宝石,以将其用于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是一个实例变量,并且在所有使用@MLself.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 

我偶然发现的事情:

  • MLVectorPathMLStopWordPath来自哪里?
  • 什么是StringPath?已分配但从未使用过.
  • 您是否有字段text?否则,将event["text"]更改为event["message"].
  • Where do MLVectorPath and MLStopWordPath come from?
  • What is StringPath? It is assigned but never used.
  • Do you have a field text? Otherwise change event["text"] into event["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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆