我编写了一个过滤器并使用其register-function来加载外部CSV文件并填充一堆散列表。然后,filter-function访问哈希表并向事件添加字段。虽然这很好用,但缺点是它只加载一次,我需要重新启动logstash以在CSV文件发生更改后触发重新加载。也许我应该补充说,过滤器当前正在消耗来自三个不同文件输入的事件。
写入输入似乎无法解决它,因为输入没有以某种方式绑定到过滤器。因此,我的计划是以某种方式每隔几个小时或在特定时间重新加载CSV文件,并在此期间以某种方式阻止整个过滤器,即暂停传入事件。这听起来像一个奇怪的事情,我不确定logstash是否真的意味着像这样使用。
我是关于Ruby的新手,实际上我很惊讶过滤器工作得很好。由于谷歌让我对整个问题感到失望,我希望这里的任何人都有这方面的经验,可以发布一个示例的链接,或者可以指向另一种解决方法。
答案 0 :(得分:1)
出于教育目的,我查看了logstash的来源,并注意到我实际上能够理解发生了什么,并且事情远没有我想象的复杂。
pipeline.rb中有一个函数filterworker
和一个filterworker
类,我不知道哪一个实际使用过,但我的发现对两者都是正确的。
基本上所有过滤器似乎都在一个线程中运行,以防它没有配置。这意味着我可以在filter-function中的任何位置重新加载文件,并且暂停所有过滤器的整个处理(输入和输出可能仍会执行某些操作,但是由队列处理最多20个条目的事件)
因此,这似乎是为我做的:
public
def register
@config_files_read_timestamps = {}
read_config_files
end # def register
def filter(event)
# return nothing unless there's an actual filter event
return unless filter?(event)
read_config_files
:
# filter_matched should go in the last line of our successful code
filter_matched(event)
end # def filter
private
def read_config_files
read_marker_file
:
end
def check_for_changed_file?(filename)
mtime = File.mtime(filename)
@config_files_read_timestamps[filename] ||= Time.at(0)
if @config_files_read_timestamps[filename] < mtime
@config_files_read_timestamps[filename] = mtime
return true
end
end
def read_marker_file
if !check_for_changed_file?("markers.txt")
return
end
:
end
显然,我不需要一个单独的线程来解析。如果我计划在特定时间开始重新加载,那将是必要的。在这种情况下,我必须加入该主题,然后继续进行事件处理。
让我知道是否有改进......