Fluentd适用于以下场景。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
- 收集多台服务器的访问日志进行可视化
- 在AWS等云端使用AutoScaling时把日志文件收集至S3(需要安装插件)
- 收集客户端的信息并输出至Message Queue,供其他应用处理
安装fluentd
在CentOS安装flentd有 RPM安装、source安装、Ruby Gem安装 3种方法,无论用何种方法安装相对简单。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
在这里使用RMP安装方法,以下的方法支持在 CentOS、RHEL 5, 6, 7、Amazon Linux 执行。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
install-redhat-td-agent2.sh脚本会在我们的主机上安装fluent agent,该脚本首先会追加 rmp源到/etc/yum.repos.d/td.repo文件,并以rpm方法安装td-agent。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
启动及停止fluentd
使用systemctl命令设定为开机自动启动。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
# systemctl enable td-agent.service
systemctl start 命令启动fluent agent。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
# systemctl start td-agent.service
停止fluent agent使用 systemctl stop命令。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
# systemctl stop td-agent.service
安装之后默认配置文件为 /etc/td-agent/td-agent.conf,该配置文件默认是http为输入并输出至/var/log/td-agent/td-agent.log文件,可用以下命令进行测试。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
# curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
查看 /var/log/td-agent/td-agent.log 文件。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
2017-05-09 12:21:56 +0800 [info]: listening fluent socket on 0.0.0.0:24224 2017-05-09 12:21:56 +0800 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine" 2017-05-09 12:45:40 +0800 debug.test: {"json":"message"}
fluentd的3个指令
配置文件里指定”source“、”match“及”include“3个指令(directive)。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
source指令决定从哪里读取日志,关键字type指定启用插件后配置相关参数。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
<source> type <指定插件> <设定项1> <设定值> <设定项2> <设定值> : : </source>
match指令设定当满足指定条件时如何处理日志的方法,在source指令追加的标签(tag)满足match指令的条件时,该日志将被指定插件处理。编写格式基本于source相同只是在match后面多了一个条件指定。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
<match <条件>> type <指定插件> <设定项1> <设定值> <设定项2> <设定值> : : </match>
条件可使用「*」、「**」及「{}」正则表达。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
符号 | 说明 |
---|---|
* | 匹配任意字符,但是必须存在 |
** | 匹配任意字符,当不存在时也匹配 |
{} | 至少匹配括号里的一个单元 |
例如条件为「a.*」时匹配「a.b」标签而不匹配「a」及「a.b.c」标签,当条件为「a.**」时匹配「a」、「a.b」及「a.b.c」标签。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
{}提供or演算符的功能,例如「{a, b, c}」条件将会匹配「a」、「b」及「c」标签。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
也可组合使用以上正则表达如「a.{b, c}.*」匹配「a.b.*」及「a.c.*」。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
最后include指令是读取其他配置文件,格式如下。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
include <其他配置文件>
配置文件可使用绝对路径或相对路径的方式指定,并且可使用「*」符号。甚至可以指定配置文件的URL,就是可通过网络读取其他主机的配置文件。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
输入及输出插件
fluentd的输入及输出处理都以插件形式提供,下面介绍一下fluentd默认插件。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
默认输入插件有6个,在这里简单介绍一下,相关的详细信息参照 fluentd官网输入插件信息。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/
插件名称 | 说明 |
---|---|
in_forward | 使用TCP/IP接收事件信息,主要用于从其他fluentd或各种编程语言日志输出模块接收事件信息。 |
in_http | 通过HTTP的POST请求接收事件信息。 |
in_tail | 监视指定日志文件,当有事件信息被添加至该日志文件时进行接收。 |
in_exec | 执行指定的外部程序,并把该外部程序的输出信息以事件信息接收。外部程序将会永久或按一定间隔定期执行。 |
in_syslog | syslog的UDP接收事件信息。 |
in_scribe | Facebook开发的日志收集服务「Scribe」协议接收事件信息。 |
默认输出插件有12个,详细信息参照 fluentd官网输出插件信息。
插件名称 | 类别 | 说明 |
---|---|---|
out_copy | Non-Buffered | 输出日志至一个以上的目标地址 |
out_null | Non-Buffered | 不进行输出 |
out_roundrobin | Non-Buffered | 以轮询调度方式向一个以上的目标地址进行输出 |
out_stdout | Non-Buffered | 输出至标准输出(一般标准输出是显示屏) |
out_exec_filter | Buffered | |
out_forward | Buffered | 通过网络向其他fluentd进行输出 |
out_mongo | Buffered | 输出至MongoDB |
out_mongo_replset | 输出至MongoDB | |
out_exec | Time Sliced | |
out_file | Time Sliced | 输出至指定文件 |
out_s3 | Time Sliced | 保存至Amazon S3存储 |
out_webhdfsQ | Time Sliced | 保存至HDFS(Hadoop Distributed File System) |
输出插件有即时进行输出的「Non-Buffered」,累积一定的事件信息之后进行处理的「Buffered」及一定间隔进行输出的「Time Sliced」3种类型。使用「Buffered」输出插件时可指定Buffer设备,Buffer设备可指定内存(memory)及文件(file)。
fluentd记录Apache访问日志
fluentd最基本的设定方法以Apache访问日志为例进行介绍,输入插件使用 in_tail 在保存Apache默认日志文件的同时使用fluentd进行记录。
in_tail插件监视指定文件当有文件有追加时,把追加内容以事件信息接收。但是Apache日志文件一般会使用logrotate工具隔一段时间切换日志文件并进行压缩,而使用 in_tail 插件时无需考虑logrotate影响因为该插件支持日志切换及压缩。
这次介绍的以下场景下对Apache访问日志的设定,如配置其他应用程序的日志文件需确认日志文件路径及格式。
- Apache日志文件:/var/log/httpd/access_log
- 日志文件格式:combined
事件信息收集设定
首先需要配置从哪里收集信息。
# gather apache access log <source> type tail ← 指定in_tail插件 path /var/log/httpd/access_log ← 指定日志文件路径 tag apache.access ← 指定标签,该标签用于 match 条件 pos_file /var/log/td-agent/httpd-access_log.pos ← 保存Apache log文件读取位置信息 format apache2 ← 指定解析的日志文件格式 </source>
推荐配置「pos_file」参数,虽然不是必须配置的参数,是记录被监视文件读取位置(如第10行为止已读取)的重要文件。
in_tail插件提供读取追加内容后解析&转换为JSON格式的功能,「format」参数可指定如下正则表达式,并等于apache2。
/^(?[^ ]*) [^ ]* (?[^ ]*) \[(?[^\]]*)\] "(?\S+)(?: +(?[^ ]*) +\S*)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\"]*)" "(?[^\"]*)")?$/
转换之后的JSON格式如下。
{ "host": "**.***.***.***", "user": null, "method": "GET", "path": "/path/to/resource/", "code": 200, "size": 143320, "referer": "http://example.com/path/to/file", "agent":"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch; MDDCJS)"} }
使用 out_file 插件进行日志文件的保存。
<match apache.access> ← 指定标签 type file ← 指定out_file插件 path /var/log/td-agent/httpd/access.log ← 指定输出文件 time_slice_format %Y%m%d ← 文件添加日期信息 time_slice_wait 10m ← 文件添加日期信息 compress gzip ← gzip压缩输出文件 </match>
out_file插件不仅是输出信息至文件,还可以根据 time_slice_format 参数值进行输出文件的切换,例如参数值为 %Y%m%d 时,输出文件名根据日期后缀变为 .<年><月><日>。
需注意的是在fluentd,事件发生时间和fluentd接收事件信息时间有时会发生时差,因此会出现输出文件日期和实际内容不相符的情况。例如23:55发生的事件信息的接收事件是0:01,这时用日期切换输出文件可能会导致该事件信息的丢失。这时可指定 time_slice_wait 参数,该参数是out_file插件根据日期分割输出文件之后,等待多长时间之后向新文件输出信息,在这里10m是10分钟。
并且输出文件可以根据文件大小进行分割默认是256MB,可使用 buffer_chunk_limit 参数进行修改。
完成以上配置之后,重新读取fluentd配置文件即会生效。

评论