“ 过滤插件是用来修改日志记录的”
filter字面意思为过滤器,实际上并非简单的把一些东西给“滤掉”。
在计算机领域,它有“清洗、修改”的意思。
比如,图形图像领域熟知的“滤镜”一词,实际上也是filter。大名鼎鼎的ffmpeg就是通过很多filter来实现音视频的编解码和转码的。
同样,Fluentd也使用filter插件来实现对日志记录的过滤和修改。
过滤插件通常用于以下场景:
- 通过grep匹配一个或多个日志字段,过滤掉不符合条件的日志
- 向日志中增加新的字段,以丰富日志内容
- 删除或掩盖某些字段,使得日志合乎规格
【使用方法】
在配置文件中通过使用<filter>指令来添加一个过滤器插件。
代码语言:javascript复制<filter foo.bar>
@type grep
regexp1 message cool
</filter>
这个配置片段用来对tag为foo.bar的日志进行过滤。
只有日志的message字段包含"cool",这条日志才会继续执行后续处理。
和用于输出插件的<match>指令一样,<filter>也是针对具有特定tag标签的日志的。
一旦日志事件被filter处理,该事件的处理过程会遵循配置文件中的顺序,自上而下地进行。
所以,如果有多个filter处理相同的tag,这些filter会依次被调用。
比如:
代码语言:javascript复制<filter foo.bar>
@type grep
regexp1 message cool
</filter>
<filter foo.bar>
@type record_transformer
<record>
hostname "#{Socket.gethostname}"
</record>
</filter>
这个配置片段中,只有message字段中包含"cool"的日志记录才会被增加hostname字段。
【过滤链路优化】
我们看到,多个filter可以形成一个过滤链路,依次执行不同的处理逻辑。
如果在处理链路中使用了多个filter,Fluentd会尝试优化对filter的调用,以提升性能。
这个优化的执行有一个前提条件,就是过滤链路中的所有插件必须使用filter方法,而不是filter_stream方法。
这个涉及到插件的开发细节,我们先不用管。
如果你在Fluentd的运行日志中发现以下信息,这表示优化被禁用了。
代码语言:javascript复制disable filter chain optimization because [Fluent::Plugin::XXXFilter] uses `#filter_stream` method
这是一个不太重要的信息,可以忽略。
【过滤插件列表】
这里列出几个常用的filter插件。
- grep
- record_transformer
- filter_stdout