使用 Logstash Filter 创建新字段
Creating a new field using Logstash Filter
我已经开始编写自己的 Logstash-filter,基于 Github:
上提供的示例过滤器
我的新过滤器从名为 Classficiation.jar
的 jar 文件中读取。我想采用来自 text
的值,并基于此 class 验证这些文本。这将需要创建一个新字段并在其中添加 class化。
操作应产生以下结果:
输入
{"text" : "This is a happy thought :)"}
输出
{"text" : "This is a happy thought :)", "classification" : "Positive"}
但是......我不确定我应该如何创建这个新字段。如您所见,class 接受一个参数,即文本。
我非常感谢有关如何为这个 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>
当我尝试在 filter
中包含 t = Java::classficiation::Classficiation.new
时,出现错误:
dynamic constant assignment
这是为什么???
您可以在 class 的末尾访问 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 过滤器。
我已经开始编写自己的 Logstash-filter,基于 Github:
上提供的示例过滤器我的新过滤器从名为 Classficiation.jar
的 jar 文件中读取。我想采用来自 text
的值,并基于此 class 验证这些文本。这将需要创建一个新字段并在其中添加 class化。
操作应产生以下结果:
输入
{"text" : "This is a happy thought :)"}
输出
{"text" : "This is a happy thought :)", "classification" : "Positive"}
但是......我不确定我应该如何创建这个新字段。如您所见,class 接受一个参数,即文本。
我非常感谢有关如何为这个 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>
当我尝试在 filter
中包含 t = Java::classficiation::Classficiation.new
时,出现错误:
dynamic constant assignment
这是为什么???
您可以在 class 的末尾访问 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 过滤器。