Fluentd配置文件语法

我们在之前的文章中介绍过Fluentd事件的生命周期,事件是按照配置文件中的配置在不同插件之间进行传递的,配置文件可以控制事件的执行顺序,对于事件的处理极为重要。
本文描述Fluentd配置文件涉及的一些基本概念。
  1. 配置文件的存放位置
    1. 如果Fluentd是通过rpm、deb或dmg等安装包来安装的,那配置文件默认为/etc/td-agent/td-agent.conf
    2. 如果Fluentd是通过ruby gem安装的,可以通过以下命令指定配置文件
      $ sudo fluentd --setup /etc/fluent$ sudo vi /etc/fluent/fluent.conf
    3. 如果使用的是docker镜像,配置文件默认为/fluentd/etc/fluentd.conf
    4. 可以通过FLUENT_CONF变量来修改使用的配置文件,该变量可在/usr/sbin/td-agent中进行设置
    5. 也可以通过-c来指定配置文件,之前文章有介绍
  2. 配置文件使用的字符集为UTF-8 或 ASCII.
  3. 配置指令
    Fluentd配置文件主要包含以下配置指令:
    source:设置输入来源
    match:设置输出目的
    filter:事件过滤器,用来控制处理流程
    system:全局配置
    label:封装一组过滤器和输出,用以调整事件的内部路由
    @include:引用其他配置文件
    接下来,我们使用这些配置指令,一步一步创建一个示例配置文件。
    1. source:这是日志的源头
      Fluentd输入源通过选择和配置所需的input插件来指定。
      Fluentd的标准input插件包含http和forward。http使得Fluentd开启一个http服务,以接收http消息;forward使得Fluentd开启一个tcp服务,以接收tcp数据包。你可以同时使用这两个插件,不限个数。
      # Receive events from 24224/tcp# This is used by log forwarding and the fluent-cat command<source> @type forward port 24224</source>
      # http://this.host:9880/myapp.access?json={"event":"data"}<source> @type http port 9880</source>

      source指令包含一个@type参数,用以指定要使用的插件。

      source将事件提交给Fluentd的路由引擎处理。事件包含tag、time和record三个属性。

      tag是以点号(.)分隔的字符串(比如,myapp.access),供Fluentd内部路由使用,建议使用小写的字母、数字、下划线来命名;time由input插件生成,必须是Unix时间格式;record是一个JSON对象。

      对于上边这个例子,http插件提交的事件格式如下:

      # generated by http://this.host:9880/myapp.access?json={"event":"data"}tag: myapp.accesstime: (current time)record: {"event":"data"}
    2. match:告诉Fluentd怎么处理收到的日志事件
      match指令查找和设置的tag相匹配的事件,并处理这些事件。通常的用法就是将事件输出到其他系统中,所以我们可以看到所有的output插件都是在此指令下添加的。
      Fluentd的标准output插件包含file和forward。我们将其添加到示例中看一下。
      # Receive events from 24224/tcp# This is used by log forwarding and the fluent-cat command<source> @type forward port 24224</source>
      # http://this.host:9880/myapp.access?json={"event":"data"}<source> @type http port 9880</source>
      # Match events tagged with "myapp.access" and# store them to /var/log/fluent/access.%Y-%m-%d# Of course, you can control how you partition your data# with the time_slice_format option.<match myapp.access> @type file path /var/log/fluent/access</match>

      每个match指令必须包含模式匹配字符串,以及@type参数。只有和模式匹配字符串相符的tag标记的事件才会被发送到目的地;和source一样,@type指定了要使用的output插件。

    3. filter:事件处理流水线
      filter和match指令语法相同,不同的是,filter可以串联起来形成处理流:
      Input -> filter 1 -> ... -> filter N -> Output

      我们继续修改上边的例子,加入一个标准的record_transformer过滤器。

      # http://this.host:9880/myapp.access?json={"event":"data"}<source> @type http port 9880</source>
      <filter myapp.access> @type record_transformer <record> host_param "#{Socket.gethostname}" </record></filter>
      <match myapp.access> @type file path /var/log/fluent/access</match>

      这个片段中,收到的http请求事件{'event':'data'}会首先进入record_transformer过滤器,这个过滤器向事件中添加了一个host_param字段,原事件被修改为{'event':'data', 'host_param':'your_host_name'}。然后接着输出到file中。

    4. system全局配置:

      Fluentd的全局配置可以在system指令中设置(除此之外,也可以通过命令行设置)。常见的一些全局配置如下:

      log_level

      suppress_repeated_stacktrace

      emit_error_log_interval

      suppress_config_dump

      without_source

      process_name

      具体含义可以参见官方文档。向我们的例子中添加一些全局参数:

      <system> # equal to -qq option log_level error # equal to --without-source option without_source # ...</system>
    5. label:封装filter和output

      把一些filter和output封装成label之后,这个label可以被其他指令直接引用,这样可以降低配置文件的复杂度。

      下边是一个示例,注意label是内置的参数,其前边需要加@符号。

      <source> @type forward</source>
      <source> @type tail @label @SYSTEM</source>
      <filter access.**> @type record_transformer <record> # ... </record></filter><match **> @type elasticsearch # ...</match>
      <label @SYSTEM> <filter var.log.middleware.**> @type grep # ... </filter> <match **> @type s3 # ... </match></label>

      在这个配置片段中,有两个input插件:forward和tail。forward产生的事件被顺序路由到record_transformer和elasticsearch中,tail产生的事件则跳转到label @SYSTEM指定的grep和s3中。

    6. include:复用其他配置文件

      我们可以把一些配置放在单独的文件中,需要用到时通过include指令将其包含到主配置中。

      # Include config files in the ./config.d directory@include config.d/*.conf

      include不仅可以指定本地路径(支持通配符),还可以引用通过url指定的配置文件。

      # http@include http://example.com/fluent.conf

      下边举一个配置复用的例子。

      # config file<match pattern> @type forward # other parameters... <buffer> @type file path /path/to/buffer/forward @include /path/to/out_buf_params.conf </buffer></match>
      <match pattern> @type elasticsearch # other parameters... <buffer> @type file path /path/to/buffer/es @include /path/to/out_buf_params.conf </buffer></match>

      # /path/to/out_buf_params.confflush_interval 5stotal_limit_size 100mchunk_limit_size 1m

      这个例子包含两个输出插件:forward和elasticsearch,都使用了文件作为输出缓存。它们使用的缓存配置是相同的,所以可以把这个配置单独提取为out_buf_params.conf,然后通过include引用到buffer指令中。

  4. Match匹配规则
    如前所述,Fluentd通过tag实现事件路由。除了精确指定tag(如<filter app.log>),还有以下几种方法可以提升匹配效率。
    1. 通配符与组合(expansions)
      在<match>和<filter>使用的tags中可以指定如下匹配模式:
      1. *:匹配单个tag段,如a.*匹配a.b,但是不匹配a、也不匹配a.b.c
      2. **:匹配0或多个tag段,如a.**匹配a、a.b和a.b.c
      3. {X,Y,Z}:匹配X、Y、Z表示的任一模式,如{a,b}匹配a和b,但不匹配c。这种模式可以和*、**组合使用,如a.{b,c}.*、a.{b,c.**}
      4. #{...}:可以在{}中使用ruby表达式进行匹配
      5. 多个模式可以空格分隔的形式组合为一个tag,用以匹配满足任一模式的事件。如<match a b>匹配a和b
    2. 匹配顺序
      Fluentd默认按照tag在配置文件中出现的顺序依次进行匹配。比如
      # ** matches all tags. Bad :(<match **> @type blackhole_plugin</match>
      <match myapp.access> @type file path /var/log/fluent/access</match>

      这个配置片段中,myapp.access永远不会被匹配到。因此,精确匹配模式需要放在宽泛匹配模式之前。

      如果包含两个相同的匹配模式,第二个也不再被匹配到。想要通过这种形式实现多路输出的话,可以参考out_copy插件。

      如果将使用同一tag的<filter>放在<match>之后,这个filter通常也不会被执行到。

      # You should NOT put this <filter> block after the <match> block below.# If you do, Fluentd will just emit events without applying the filter.<filter myapp.access> @type record_transformer ...</filter>
      <match myapp.access> @type file path /var/log/fluent/access</match>
    3. 内嵌ruby表达式(暂不作研究,可自查文档)
  5. 参数值支持的数据类型
  6. 每个插件支持若干参数,每个参数接受不同类型的值。下边是Fluentd支持的参数数据类型。

    1. string:字符串,最常用的数据类型,可以为单行不带引号的字符串,或者单引号'或双引号"引用的字符串
    2. integer:整型数字
    3. float:浮点数
    4. size:字节数,可以附加k、m、g、t等单位
    5. time:时长,可以附加s、m、h、d等时间单位
    6. array:JSON数组
    7. hash:JSON数组
  7. 通用插件参数
    系统保留的参数,以@为前缀。
    1. @type:插件类型
    2. @id:插件id,in_monitor_agent使用此参数
    3. @label:标签,封装filter和match
    4. @log_level:设置插件使用的日志级别
  8. 配置检查
    配置文件编写完成之后,可以通过以下命令做下检查
    $ fluentd --dry-run -c fluent.conf

    或者

    $ /etc/init.d/td-agent configtest
  9. 配置格式相关事项
    1. 双引号字符串和array、hash支持多行
      str_param "foo # This line is converted to "foo\nbar". NL is kept in the parameterbar"array_param [ "a", "b"]hash_param { "k":"v", "k1":10}
    2. 双引号字符串使用\转义
      str_param "foo\nbar" # \n is interpreted as actual LF character

以上就是Fluentd配置文件的一些基本内容。

【洋洋洒洒写了这么多,你的点赞和转发是对我的最大鼓励!】

(0)

相关推荐