fluentd收集日志文件

  • A+
所属分类:大数据

fluentd

Fluentd是一个收集日志文件的开源软件,目前提供数百个插件可用于存储大数据用于日志搜索,数据分析和存储。

Fluentd适用于以下场景。

  • 收集多台服务器的访问日志进行可视化
  • 在AWS等云端使用AutoScaling时把日志文件收集至S3(需要安装插件)
  • 收集客户端的信息并输出至Message Queue,供其他应用处理

安装fluentd

在CentOS安装flentd有 RPM安装、source安装、Ruby Gem安装 3种方法,无论用何种方法安装相对简单。

在这里使用RMP安装方法,以下的方法支持在 CentOS、RHEL 5, 6, 7、Amazon Linux 执行。

install-redhat-td-agent2.sh脚本会在我们的主机上安装fluent agent,该脚本首先会追加 rmp源到/etc/yum.repos.d/td.repo文件,并以rpm方法安装td-agent。

启动及停止fluentd

使用systemctl命令设定为开机自动启动。

systemctl start 命令启动fluent agent。

停止fluent agent使用 systemctl stop命令。

安装之后默认配置文件为 /etc/td-agent/td-agent.conf,该配置文件默认是http为输入并输出至/var/log/td-agent/td-agent.log文件,可用以下命令进行测试。

查看 /var/log/td-agent/td-agent.log 文件。

fluentd的3个指令

配置文件里指定”source“、”match“及”include“3个指令(directive)。

source指令决定从哪里读取日志,关键字type指定启用插件后配置相关参数。

match指令设定当满足指定条件时如何处理日志的方法,在source指令追加的标签(tag)满足match指令的条件时,该日志将被指定插件处理。编写格式基本于source相同只是在match后面多了一个条件指定。

条件可使用「*」、「**」及「{}」正则表达。

符号 说明
* 匹配任意字符,但是必须存在
** 匹配任意字符,当不存在时也匹配
{} 至少匹配括号里的一个单元

例如条件为「a.*」时匹配「a.b」标签而不匹配「a」及「a.b.c」标签,当条件为「a.**」时匹配「a」、「a.b」及「a.b.c」标签。

{}提供or演算符的功能,例如「{a, b, c}」条件将会匹配「a」、「b」及「c」标签。

也可组合使用以上正则表达如「a.{b, c}.*」匹配「a.b.*」及「a.c.*」。

最后include指令是读取其他配置文件,格式如下。

配置文件可使用绝对路径或相对路径的方式指定,并且可使用「*」符号。甚至可以指定配置文件的URL,就是可通过网络读取其他主机的配置文件。

输入及输出插件

fluentd的输入及输出处理都以插件形式提供,下面介绍一下fluentd默认插件。

默认输入插件有6个,在这里简单介绍一下,相关的详细信息参照 fluentd官网输入插件信息

插件名称 说明
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

事件信息收集设定

首先需要配置从哪里收集信息。

推荐配置「pos_file」参数,虽然不是必须配置的参数,是记录被监视文件读取位置(如第10行为止已读取)的重要文件。

in_tail插件提供读取追加内容后解析&转换为JSON格式的功能,「format」参数可指定如下正则表达式,并等于apache2。

转换之后的JSON格式如下。

使用 out_file 插件进行日志文件的保存。

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配置文件即会生效。

weinxin
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
默北

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: