0

我已经开始编写自己的 Logstash-filter,基于 Github 上提供的示例过滤器:

https://github.com/logstash-plugins/logstash-filter-example

我的新过滤器从名为Classficiation.jar. 我想获取来自text并基于它的值,对这些文本进行分类。这将需要创建一个新字段并在其中添加分类。

该操作应导致以下结果:

输入

{"text" : "This is a happy thought :)"}

输出

{"text" : "This is a happy thought :)", "classification" : "Positive"}

但是......我不确定我应该如何创建这个新领域。如您所见,该类采用一个参数,即文本。

我非常感谢有关如何为此 logstash 过滤器的输出创建新字段的指导。

# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"
require 'java'
require 'Classficiation.jar'

import 'classficiation.Classficiation'

class LogStash::Filters::Classify < LogStash::Filters::Base

  # This is how to configure this filter from Logstash config.
  #
  # filter {
  #   classify {
  #   }
  # }
  #
  config_name "classify"


  t = Java::classficiation::Classficiation.new
  result = t.Classify(:text)
  # This should return a classification for the text, either positive
  # or negative

  public
  def register
  end

  public
  def filter(event)    
    ..........

    filter_matched(event)
  end
end

谢谢你。


更新

我已按照@hurb 提供给我的说明进行操作,并编辑了我的文件,使其看起来像这样:

# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"
require 'java'
require 'Classficiation.jar'

import 'classficiation.Classficiation'

class LogStash::Filters::Classify < LogStash::Filters::Base

  config_name "classify"

  t = Java::classficiation::Classficiation.new

  public
  def register
  end

  public
  def filter(event)    
    event["result"] = t.Classify(event["text"])
    filter_matched(event)
  end
end

但是,这开始给我错误:

NameError: undefined local variable or method 'Classify' for #<LogStash::Filters::Classify:0x44850d11>

当我尝试包含t = Java::classficiation::Classficiation.new在 中时filter,它给了我错误:

dynamic constant assignment

这是为什么???

4

1 回答 1

0

filter(event)您可以在课程结束时访问函数内的所有事件字段。可以使用event参数访问字段:event["message"]. 因此,event["result"] = t.Classify(event["text"])您可能正在寻找类似的东西(它会创建一个新字段result.

但是,我认为您的代码还有其他一些问题。请仔细检查您的filter(event)功能。似乎有一个不必要的end。我不确定 java 导入,但我认为它应该是java_import 'classficiation.Classficiation'而不是import.

这样开始:

# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"
require 'java'
require 'Classficiation.jar'

java_import 'classficiation.Classficiation'

class LogStash::Filters::Classify < LogStash::Filters::Base

  config_name "classify"

  public
  def register
  end

  public
  def filter(event)    
     t = Java::classficiation::Classficiation.new
     event["result"] = t.Classify(event["text"])
     filter_matched(event)
  end

end

如果您需要进一步的帮助,请告诉我。


更新

为了调试你的 jruby 代码,我建议在 logstash 之外测试它的功能。像这样的东西应该工作:

#!/usr/bin/env jruby

require 'java'
java_import 'classficiation.Classficiation'
t = Classficiation.new
result = t.Classify("foobar")
puts result

您可以尝试执行这样的脚本,看看它是否提供了所需的输出。之后尝试将其迁移到 logstash 过滤器。

于 2015-11-02T15:35:00.150 回答