ELK,萌萌哒

logstash 可以同时应用多个filter,filter的顺序如何控制?

Logstash | 作者 silver9527 | 发布于2019年12月25日 | 阅读数:6361

我这边要使用filter对原始日志做加工,由于处理步骤较多,而且其中部分是可以复用的所以我就像写多个filter配置文件,此时应该如何控制filter执行的先后顺序?filter执行的逻辑是怎样的?
比如,我测试在filter1.conf中使用add_field添加了一个字段myval,然后我再filter2.conf里面对myval进行处理,测试是成功了的,这就是说filter1肯定在filter2之前执行成功了否则filter2找不到这个字段,测试虽然可以,但是会不会发生filter2先执行导致不成功呢?
因此,我如果想手动控制filter的执行顺序,应该在哪里设置?
以及,是否有可能定义多个filter(类似定义函数)然后在一个conf配置里面进行条件判断和调用,比如符合某个条件就调用某个预定义的filter,这样就更加灵活了。
已邀请:

silver9527

赞同来自:

看到有大神给了执行顺序,filter/mutate 内部是有执行次序的。其次序如下:
    rename(event) if @rename
    update(event) if @update
    replace(event) if @replace
    convert(event) if @convert
    gsub(event) if @gsub
    uppercase(event) if @uppercase
    lowercase(event) if @lowercase
    strip(event) if @strip
    remove(event) if @remove
    split(event) if @split
    join(event) if @join
    merge(event) if @merge

    filter_matched(event)
而 filter_matched 这个 filters/base.rb 里继承的方法也是有次序的。
  @add_field.each do |field, value|
  end
  @remove_field.each do |field|
  end
  @add_tag.each do |tag|
  end
  @remove_tag.each do |tag|
  end
这里面不太理解的是,是否add_field这些都只会在rename/update等之后执行?
另外就是,我刚了解到filter是可以自定义的,那么如果我定义了多个自己的filter,比如myfilter1,myfilter2这种,
是否可以用写这样的logstash的conf文件
if condition { mutate { } myfilter1 {} myfilter2 {}}类似这种,这时候满足condition的数据会依次经过mutate,myfilter1,myfilter2执行?

zqc0512 - andy zhou

赞同来自:

数据量大么?大的话,不建议用logstash处理这么多逻辑。你可以试试flume这些。

silver9527

赞同来自:

测试了下,mutate里面执行有顺序,但是可以做多个mutate鸭,这就可以控制顺序了,原来怎么简单,,,
不过研究了下自定义filter和ruby基础语法,倒也不是没有收获,
感谢@zqc0512大佬,我目前只是测试和研究,数据量不大

要回复问题请先登录注册