Filter 使用Logstash筛选器创建新字段
基于Github上提供的示例过滤器,我已经开始编写自己的Logstash过滤器: 我的新过滤器读取名为Classficiation.jar的jar文件。我想取文本中的值,并以此为基础,对这些文本进行分类。这将需要创建一个新字段并在其中添加分类 该操作应产生以下结果: 输入Filter 使用Logstash筛选器创建新字段,filter,logstash,logstash-grok,logstash-configuration,logstash-file,Filter,Logstash,Logstash Grok,Logstash Configuration,Logstash File,基于Github上提供的示例过滤器,我已经开始编写自己的Logstash过滤器: 我的新过滤器读取名为Classficiation.jar的jar文件。我想取文本中的值,并以此为基础,对这些文本进行分类。这将需要创建一个新字段并在其中添加分类 该操作应产生以下结果: 输入 {"text" : "This is a happy thought :)"} 输出 {"text" : "This is a happy thought :)", "classification" : "Positive"
{"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时,它会给出错误:
NameError: undefined local variable or method 'Classify' for #<LogStash::Filters::Classify:0x44850d11>
动态常数赋值
为什么会这样?您可以在类的末尾访问filterevent函数中的所有事件字段。可以使用事件参数event[message]访问字段。因此,类似于event[result]=t.Classifyevent[text]的内容可能就是您要查找的内容,它会创建一个新的字段结果 但是,我认为您的代码还存在一些其他问题。请仔细检查您的filterevent功能。似乎有一个不必要的结局。我不确定java导入,但我认为应该是java_导入'classficiation.classficiation'而不是导入 这样开始:
# 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
您可以尝试执行这样的脚本,看看它是否提供了所需的输出。然后尝试将其迁移到logstash过滤器。hmm好的,我这样做了,然后想用logstash测试过滤器。但是,当我在那里安装gem as过滤器时,它给出了错误过滤器notinstalled,即使列出已安装的过滤器显示已安装此特定过滤器。。你知道我为什么会犯这个错误吗?谢谢,我想添加多个字段。事件将占用多个字段,对吗?所以它看起来像这样:event[result]=t.Classifyevent[text]\n event[result2]=a.Classify2event[text]Hm,您使用的是哪个版本的日志存储?您是否尝试安装其他过滤器?例如,logstash过滤器示例?您使用哪个命令安装过滤器?回答你的第二个问题应该是logstash/bin/plugin install logstash-filter-abc.gem:是的,多个字段都很好。别介意前面的问题,我都能解决。并且我能够在logstash.conf文件中包含我的自定义过滤器,并在没有错误的情况下启动logstash。但是,当我输入一些东西时,它会给我一个错误名称error:undefined local variable或method'Classify',请注意,我必须移动t=Java::classfication::classfication.new外部筛选器,因为它给了我错误动态常量赋值