Fluentd 是完全开源免费的日志收集系统,支持在超过125种不同类型的系统上收集日志。
其系统示意图如下:
在RedHat/CentOS 6, 7 64位系统上可以用下列方式安装:
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh
根据系统版本可以用下列两种方式之一启动:
systemctl start td-agent
/etc/init.d/td-agent start
默认安装的话,配置文件在/etc/td-agent/td-agent.conf,从HTTP的8888端口接收日志并路由到stdout(/var/log/td-agent/td-agent.log)。可以用下列命令发起测试日志:
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
查看日志的最后一行即是刚刚发送的测试日志:
# tail /var/log/td-agent/td-agent.log
2018-09-14 16:42:14 +0800 [warn]: #0 [output_td] secondary type should be same with primary one primary="Fluent::Plugin::TreasureDataLogOutput" secondary="Fluent::Plugin::FileOutput"
2018-09-14 16:42:14 +0800 [info]: adding match pattern="debug.**" type="stdout"
2018-09-14 16:42:14 +0800 [info]: adding source type="forward"
2018-09-14 16:42:14 +0800 [info]: adding source type="http"
2018-09-14 16:42:14 +0800 [info]: adding source type="debug_agent"
2018-09-14 16:42:14 +0800 [info]: #0 starting fluentd worker pid=24064 ppid=24051 worker=0
2018-09-14 16:42:14 +0800 [info]: #0 [input_debug_agent] listening dRuby uri="druby://127.0.0.1:24230" object="Fluent::Engine" worker=0
2018-09-14 16:42:14 +0800 [info]: #0 [input_forward] listening port port=24224 bind="0.0.0.0"
2018-09-14 16:42:14 +0800 [info]: #0 fluentd worker is now running worker=0
2018-09-14 16:46:16.388094455 +0800 debug.test: {"json":"message"}
配置文件用于让用户控制Fluentd输入(input)和输出(output)的行为:(1) 选择输入和输出插件,(2) 指定插件参数。配置文件要求必须存在以使Fluentd正常工作。
Fluentd假设配置文件编码为UTF-8或ASCII。
配置文件由下列指令组成:
选择和配置Fluentd的输入源,需要用source指令。Fluentd的标准输入插件包括http和forward。http监听HTTP端口,并接受从HTTP来的日志消息。forward让fluentd监听TCP端口,并接受TCP包。当然,两者可以同时开启(可以添加任意多需要的源)。
# Receive events from 24224/tcp
# This is used by log forwarding and the fluent-cat command
# http://this.host:9880/myapp.access?json={"event":"data"}
每个source指令必须包含 @type 参数。@type 参数指定了何种输入插件将被使用。
source 将事件提交到Fluentd的路由引擎。每个事件由3部分实体组成:tag, time 和 record。tag 是由’.'分隔的字符串(如:myapp.access),并且作为Fluentd内部路由的指示。time字段由 input 插件指定,并且必须得是Unix时间格式。record 是一个JSON对象。
match 指令查找所有具有匹配tag的事件,并且进行处理。match 指令最常见的用法是将事件输出到其它系统(因此,对应于match指令的插件被称为"output"插件)。Fluentd的标准输出插件包括 file 和 forward。现在来加入到配置文件中。
# Receive events from 24224/tcp
# This is used by log forwarding and the fluent-cat command
# http://this.host:9880/myapp.access?json={"event":"data"}
# 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.
@type file
path /var/log/fluent/access
每个 match 指令必须包括一个匹配模板和一个 @type 参数。只有tag 匹配到模板的事件会被送到输出目的地(在上述示例中,只有tag为"myapp.access"的事件会被匹配)。@type 参数指定了将要使用的 output 插件。
filter 指令与 match 有相同的语法,但 filter 可以将处理串成管道。 使用 filter 时事件流看起来会像这样:
Input -> filter 1 -> ... -> filter N -> Output
现在添加一个标准的 record_transformer filter 到刚刚写的 match 示例中。
# http://this.host:9880/myapp.access?json={"event":"data"}
@type record_transformer
host_param "#{Socket.gethostname}"
@type file
path /var/log/fluent/access
收到事件 {“event”: “data”} 后,先扔到filter: record_transformer中,record_transformer 在事件中添加了"host_param" 字段并且继续向后传,{“event”:“data”,“host_param”:“webserver1”},事件最终到达 file 输出插件。
下列 match 模板可以用于
Fluentd 尝试以模板在配置文件中出现的顺序进行匹配。所以看下面的例子:
# ** matches all tags. Bad :(
@type blackhole_plugin
@type file
path /var/log/fluent/access
上面例子中,myapp.access 永远都匹配不到。更宽松的匹配模板应定义在更严格的匹配模板之后。像这样:
@type file
path /var/log/fluent/access
# Capture all unmatched tags. Good :)
@type blackhole_plugin
当然,如果有两个同样的模板,后一个match将永远无法匹配。如果你希望将事件发送到多个输出,应考虑使用 out_copy 插件。
常见的陷阱是将
out_copy 是Fluentd的核心插件,无须另外安装,out_copy 将事件复制多份,分别送到多个输出插件中去。直接来个例子:
@type copy
@type file
path /var/log/fluent/myapp1
...
...
...
下面的例子将事件存到本地文件夹/var/log/fluent/myapp下,同时发送到Elasticsearch实例的fluentd.test 集合中。具体请参见out_file和out_elasticsearch插件的细节说明。
@type copy
@type file
path /var/log/fluent/myapp
compress gzip
localtime false
timekey_wait 10m
timekey 86400
timekey_use_utc true
path /var/log/fluent/myapp
time_format %Y%m%dT%H%M%S%z
localtime false
@type elasticsearch
host 192.168.198.46
port 9200
index_name fluentd
type_name test
启动一个docker,并将log-driver指向fluentd,即可将日志输出到fluentd,再转发至elasticsearch,同时本地留有日志备份。
docker run --rm --log-driver fluentd --log-opt fluentd-address=192.168.198.46:24224 --log-opt tag=docker.test alpine date
@type - 此值必须为"copy"
deep_copy - 深度复制,默认为false,out_copy在各store插件间共享事件记录。当此值为true时,out_copy为每一store插件复制一份事件记录。
ignore_error - 忽略错误。当某一store出现错误时,这个参数将作用于其余store,例如:
@type copy
@type plugin1
@type plugin2
若plugin1出现错误时,plugin2将不会被执行。若希望忽略不重要的store出现的错误时,可以指定该store的ignore_error参数。
@type copy
@type plugin1
@type plugin2