我这边要使用filter对原始日志做加工,由于处理步骤较多,而且其中部分是可以复用的所以我就像写多个filter配置文件,此时应该如何控制filter执行的先后顺序?filter执行的逻辑是怎样的?
比如,我测试在filter1.conf中使用add_field添加了一个字段myval,然后我再filter2.conf里面对myval进行处理,测试是成功了的,这就是说filter1肯定在filter2之前执行成功了否则filter2找不到这个字段,测试虽然可以,但是会不会发生filter2先执行导致不成功呢?
因此,我如果想手动控制filter的执行顺序,应该在哪里设置?
以及,是否有可能定义多个filter(类似定义函数)然后在一个conf配置里面进行条件判断和调用,比如符合某个条件就调用某个预定义的filter,这样就更加灵活了。
比如,我测试在filter1.conf中使用add_field添加了一个字段myval,然后我再filter2.conf里面对myval进行处理,测试是成功了的,这就是说filter1肯定在filter2之前执行成功了否则filter2找不到这个字段,测试虽然可以,但是会不会发生filter2先执行导致不成功呢?
因此,我如果想手动控制filter的执行顺序,应该在哪里设置?
以及,是否有可能定义多个filter(类似定义函数)然后在一个conf配置里面进行条件判断和调用,比如符合某个条件就调用某个预定义的filter,这样就更加灵活了。
3 个回复
silver9527
赞同来自:
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
赞同来自:
silver9527
赞同来自:
不过研究了下自定义filter和ruby基础语法,倒也不是没有收获,
感谢@zqc0512大佬,我目前只是测试和研究,数据量不大