Logstash:处理过滤器的配置文件

时间:2014-07-03 07:59:57

标签: ruby logstash

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

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

我是关于Ruby的新手,实际上我很惊讶过滤器工作得很好。由于谷歌让我对整个问题感到失望,我希望这里的任何人都有这方面的经验,可以发布一个示例的链接,或者可以指向另一种解决方法。

1 个答案:

答案 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

显然,我不需要一个单独的线程来解析。如果我计划在特定时间开始重新加载,那将是必要的。在这种情况下,我必须加入该主题,然后继续进行事件处理。

让我知道是否有改进......