天天看点

Fluentd插件:过滤插件概述

“ 过滤插件是用来修改日志记录的”

filter字面意思为过滤器,实际上并非简单的把一些东西给“滤掉”。在计算机领域,它有“清洗、修改”的意思。比如,图形图像领域熟知的“滤镜”一词,实际上也是filter。大名鼎鼎的ffmpeg就是通过很多filter来实现音视频的编解码和转码的。

同样,Fluentd也使用filter插件来实现对日志记录的过滤和修改。

过滤插件通常用于以下场景:

  1. 通过grep匹配一个或多个日志字段,过滤掉不符合条件的日志
  2. 向日志中增加新的字段,以丰富日志内容
  3. 删除或掩盖某些字段,使得日志合乎规格

【使用方法】

在配置文件中通过使用<filter>指令来添加一个过滤器插件。

<filter foo.bar>              @type grep              regexp1 message cool              </filter>           

这个配置片段用来对tag为foo.bar的日志进行过滤。

只有日志的message字段包含"cool",这条日志才会继续执行后续处理。

和用于输出插件的<match>指令一样,<filter>也是针对具有特定tag标签的日志的。

一旦日志事件被filter处理,该事件的处理过程会遵循配置文件中的顺序,自上而下地进行。

所以,如果有多个filter处理相同的tag,这些filter会依次被调用。

比如:

<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的运行日志中发现以下信息,这表示优化被禁用了。

disable filter chain optimization because [Fluent::Plugin::XXXFilter] uses `#filter_stream` method           

这是一个不太重要的信息,可以忽略。

【过滤插件列表】

这里列出几个常用的filter插件。

  • grep
  • record_transformer
  • filter_stdout

我们接下来会一起学习这几个常用过滤插件的使用方法。