Fluentd配置文件语法
配置文件的存放位置 如果Fluentd是通过rpm、deb或dmg等安装包来安装的,那配置文件默认为/etc/td-agent/td-agent.conf 如果Fluentd是通过ruby gem安装的,可以通过以下命令指定配置文件 $ sudo fluentd --setup /etc/fluent
$ sudo vi /etc/fluent/fluent.conf
如果使用的是docker镜像,配置文件默认为/fluentd/etc/fluentd.conf 可以通过FLUENT_CONF变量来修改使用的配置文件,该变量可在/usr/sbin/td-agent中进行设置 也可以通过-c来指定配置文件,之前文章有介绍 配置文件使用的字符集为UTF-8 或 ASCII. 配置指令 Fluentd配置文件主要包含以下配置指令: source:设置输入来源 match:设置输出目的 filter:事件过滤器,用来控制处理流程 system:全局配置 label:封装一组过滤器和输出,用以调整事件的内部路由 @include:引用其他配置文件 接下来,我们使用这些配置指令,一步一步创建一个示例配置文件。 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.access
time: (current time)
record: {"event":"data"}
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插件。
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中。
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>
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中。
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.conf
flush_interval 5s
total_limit_size 100m
chunk_limit_size 1m
这个例子包含两个输出插件:forward和elasticsearch,都使用了文件作为输出缓存。它们使用的缓存配置是相同的,所以可以把这个配置单独提取为out_buf_params.conf,然后通过include引用到buffer指令中。
Match匹配规则 如前所述,Fluentd通过tag实现事件路由。除了精确指定tag(如<filter app.log>),还有以下几种方法可以提升匹配效率。 通配符与组合(expansions) 在<match>和<filter>使用的tags中可以指定如下匹配模式: *:匹配单个tag段,如a.*匹配a.b,但是不匹配a、也不匹配a.b.c **:匹配0或多个tag段,如a.**匹配a、a.b和a.b.c {X,Y,Z}:匹配X、Y、Z表示的任一模式,如{a,b}匹配a和b,但不匹配c。这种模式可以和*、**组合使用,如a.{b,c}.*、a.{b,c.**} #{...}:可以在{}中使用ruby表达式进行匹配 多个模式可以空格分隔的形式组合为一个tag,用以匹配满足任一模式的事件。如<match a b>匹配a和b 匹配顺序 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>
内嵌ruby表达式(暂不作研究,可自查文档) 参数值支持的数据类型 string:字符串,最常用的数据类型,可以为单行不带引号的字符串,或者单引号'或双引号"引用的字符串 integer:整型数字 float:浮点数 size:字节数,可以附加k、m、g、t等单位 time:时长,可以附加s、m、h、d等时间单位 array:JSON数组 hash:JSON数组 通用插件参数 系统保留的参数,以@为前缀。 @type:插件类型 @id:插件id,in_monitor_agent使用此参数 @label:标签,封装filter和match @log_level:设置插件使用的日志级别 配置检查 配置文件编写完成之后,可以通过以下命令做下检查 $ fluentd --dry-run -c fluent.conf
或者
$ /etc/init.d/td-agent configtest
配置格式相关事项 双引号字符串和array、hash支持多行 str_param "foo # This line is converted to "foo\nbar". NL is kept in the parameter
bar"
array_param [
"a", "b"
]
hash_param {
"k":"v",
"k1":10
}
双引号字符串使用\转义 str_param "foo\nbar" # \n is interpreted as actual LF character
每个插件支持若干参数,每个参数接受不同类型的值。下边是Fluentd支持的参数数据类型。
以上就是Fluentd配置文件的一些基本内容。
【洋洋洒洒写了这么多,你的点赞和转发是对我的最大鼓励!】