Ruby Logstash:处理筛选器的配置文件

Ruby Logstash:处理筛选器的配置文件,ruby,logstash,Ruby,Logstash,我编写了一个过滤器,并使用它的register函数加载一个外部CSV文件并填充一组哈希表。然后,filter函数访问哈希表并向事件添加字段。虽然它工作得很好,但缺点是它只加载一次,在CSV文件发生更改后,我需要重新启动logstash以触发重新加载。也许我应该补充一点,过滤器当前正在使用来自三个不同文件输入的事件 写一个输入似乎并不能解决这个问题,因为输入在某种程度上并没有绑定到过滤器。因此,我的计划是每隔几个小时或在特定时间以某种方式重新加载CSV文件,并在此期间以某种方式阻止整个过滤器,即暂

我编写了一个过滤器,并使用它的register函数加载一个外部CSV文件并填充一组哈希表。然后,filter函数访问哈希表并向事件添加字段。虽然它工作得很好,但缺点是它只加载一次,在CSV文件发生更改后,我需要重新启动logstash以触发重新加载。也许我应该补充一点,过滤器当前正在使用来自三个不同文件输入的事件

写一个输入似乎并不能解决这个问题,因为输入在某种程度上并没有绑定到过滤器。因此,我的计划是每隔几个小时或在特定时间以某种方式重新加载CSV文件,并在此期间以某种方式阻止整个过滤器,即暂停传入事件。这听起来很奇怪,我不确定logstash是否真的应该这样使用


我对Ruby是个新手,事实上,我很惊讶这个过滤器能这么好地工作。由于谷歌在整个问题上让我失望,我希望在座的任何人都有这方面的经验,你可以发一个链接到一个例子,或者给我指出解决这个问题的另一种方法。

出于教育目的,我查看了logstash的来源,发现我实际上可以理解正在发生的事情,事情比我想象的要简单得多

在和一个类中有一个函数
filterworker
,我不知道实际使用的是哪一个,但我的发现似乎对这两个都是正确的

基本上所有的过滤器似乎都在一个线程中运行,以防它没有被配置成其他类型。这意味着我可以在filter函数中的任何位置重新加载文件,并且所有过滤器的整个处理过程都会暂停(输入和输出可能仍会执行某些操作,但对于最多包含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
公共
def寄存器
@配置文件读取时间戳={}
读取配置文件
结束#def寄存器
def过滤器(事件)
#除非存在实际的筛选器事件,否则不返回任何内容
除非过滤,否则返回?(事件)
读取配置文件
:    
#匹配的过滤器应该放在成功代码的最后一行
过滤器匹配(事件)
结束#def过滤器
私有的
def read_config_文件
读取标记文件
:
结束
def check_查找已更改的_文件?(文件名)
mtime=File.mtime(文件名)
@config_files_read_timestamps[filename]||=Time.at(0)
如果@config\u files\u read\u时间戳[文件名]
显然,我不需要单独的线程进行解析。如果我计划在特定的时间开始重新加载,这将是必要的。在这种情况下,我必须加入线程,然后继续进行事件处理

让我知道是否有改进